我需要显示棋盘。我有一个扩展JPanel的BoardPanel类和一个包含BoardPanel的GamePanel(也扩展JPanel)类。 GamePanel填充所有应用程序框架。
我希望BoardPanel始终是一个大小等于GamePanel宽度和高度最小值的正方形(如果GamePanel的宽度大于高度,则左右应该有空白区域,如果它更小则应该有空白空间顶部和底部)。将BoardPanel显示在父面板的中心也很重要。
我是这样写的:public GamePanel() {
setLayout(new BorderLayout(0, 0));
boardPanel = new BoardPanel(...);
this.add(boardPanel, BorderLayout.CENTER);
...
}
并在BoardPanel中:
public void paintComponent(Graphics g) {
super.paintComponent(g);
int size = Math.min(this.getParent().getHeight(), this.getParent().getWidth());
this.setSize(size, size);
...
}
它调整得很好,但棋盘总是显示在GamePanel的左上角(所有空白区域显示在机器人或右侧),我不知道如何解决它。
有任何帮助吗?提前谢谢!
答案 0 :(得分:4)
使用GridBagLayout
。
import java.awt.*;
import javax.swing.*;
public class CenteredPanel {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new GridBagLayout());
JPanel square = new SquarePanel();
square.setBackground(Color.RED);
gui.add(square);
JFrame f = new JFrame("SquareBoard");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.add(gui);
f.setMinimumSize(new Dimension(400,100));
f.pack();
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
class SquarePanel extends JPanel {
@Override
public Dimension getPreferredSize() {
Container c = this.getParent();
int size = Math.min(c.getHeight(), c.getWidth());
Dimension d = new Dimension(size,size);
return d;
}
}
答案 1 :(得分:2)
new BorderLayout(0,0)
无需使用BorderLayout
的默认构造函数
请勿致电setSize()
而是覆盖getPreferredSize()
的{{1}},如下所示:
JPanel
在你的@Override
public void getPreferredSize() {
int size = Math.min(this.getParent().getHeight(), this.getParent().getWidth());
return new Dimension(size,size);
}
中工作也绝不好,因为这应该只用于绘画。
如果以上操作不起作用,我建议使用SSCCE来说明您可能遇到的具体问题