Java,BorderLayout.CENTER,获取JPanel的宽度和高度

我正在使用Swing和AWT(为听众)制作一个小程序。 我有一个问题,关于获取我的JPanel(名为Chess的类)的大小。 我的布局:

public class Main extends JFrame implements MouseListener, ActionListener{ Chess chessPanel = new Chess (); JButton newGameButton = new JButton ("New Game"); JButton loadGameButton = new JButton ("Load Game"); JButton saveGameButton = new JButton ("Save Game"); JButton exitButton = new JButton ("Exit"); public static void main (String [] args) { new Main(); } Main () { super ("Chess"); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); setSize(dim); setLocation(0,0); setUndecorated(true); chessPanel.addMouseListener(this); add(chessPanel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout()); newGameButton.addActionListener(this); loadGameButton.addActionListener(this); saveGameButton.addActionListener(this); exitButton.addActionListener(this); buttonPanel.add(newGameButton); buttonPanel.add(loadGameButton); buttonPanel.add(saveGameButton); buttonPanel.add(exitButton); add(buttonPanel, BorderLayout.SOUTH); setVisible(true); } // ... Code ... } 

正如您在代码中看到的那样,我在CENTER中有一个JPanel,几乎占据了整个屏幕。 在底部我有另一个JPanel(SOUTH),它有一排按钮。

我需要的是CENTER中的JPanel所需的大小。 当我调用从JPanelinheritance的getWidth(),getHeight()或getBounds()方法时,由于BorderLayout,它们都返回0。 知道如何获得真正的价值吗?

PS:屏幕总是占据整个屏幕,如果有帮助,永远不会resize。

您可能在渲染JPanel之前调用getWidth,因此它将为0.解决方案是渲染获取大小,例如在已保存的根容器上调用pack()或setVisible(true)之后这个JPanel。

此外,我建议不要在任何事情上调用setSize(),因为大多数标准布局管理器都会观察组件的首选大小,而不是大小,当你调用pack()告诉布局管理器做他们的事情时,设置的大小是通常被忽略了 您可能希望通过覆盖其setPreferredSize方法(例如,如果它需要特定大小)来使位于中心的JPanel设置其自己的大小。 然后让JFrame及其持有的容器在调用pack时根据其布局管理器设置下注大小。

例如,

 import java.awt.*; import javax.swing.*; public class Main extends JFrame { Chess chessPanel = new Chess(); JButton newGameButton = new JButton("New Game"); JButton loadGameButton = new JButton("Load Game"); JButton saveGameButton = new JButton("Save Game"); JButton exitButton = new JButton("Exit"); public static void main(String[] args) { new Main(); } Main() { super("Chess"); add(chessPanel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout()); buttonPanel.add(newGameButton); buttonPanel.add(loadGameButton); buttonPanel.add(saveGameButton); buttonPanel.add(exitButton); System.out.printf("chessPanel Size before rendering: %s%n", chessPanel.getSize()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(buttonPanel, BorderLayout.SOUTH); pack(); System.out.printf("chessPanel Size after rendering: %s%n", chessPanel.getSize()); setLocationRelativeTo(null); setVisible(true); } // ... Code ... } @SuppressWarnings("serial") class Chess extends JPanel { private static final int CHESS_WIDTH = 600; private static final int CHESS_HEIGHT = CHESS_WIDTH; private static final int MAX_ROW = 8; private static final int MAX_COL = 8; private static final Color LIGHT_COLOR = new Color(240, 190, 40); private static final Color DARK_COLOR = new Color(180, 50, 0); @Override public Dimension getPreferredSize() { return new Dimension(CHESS_WIDTH, CHESS_HEIGHT); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); int panelWidth = getWidth(); int panelHeight = getHeight(); int sqrWidth = panelWidth / MAX_ROW; int sqrHeight = panelHeight / MAX_COL; for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { Color c = (row % 2 == col % 2) ? LIGHT_COLOR : DARK_COLOR; g.setColor(c); int x = (row * panelWidth) / MAX_ROW; int y = (col * panelHeight) / MAX_COL; g.fillRect(x, y, sqrWidth, sqrHeight); } } } }