感谢您花时间阅读本文。我希望这不会造成混淆,如果需要任何其他信息,请告诉我!
问题: 我正在制作一个贪吃蛇游戏,我创建了一个 JFrame,然后添加了 JPanel。好吧,如果我不在 JFrame 中设置它的大小,它的大小将约为 100 x 20。当我设置它的大小时,它保持在设置的尺寸。但是,如果我 pack() 它,当我在 JPanel 中定义大小时,它会缩小到 100 x 20 左右。我也设定了界限,但没有运气。我使用 FlowLayout() 和 BorderLayout() 也没有成功。现在我的游戏运行正常,没有任何问题,除了框架。它会切断侧面,除非我做一些我不想做的体操。
目标: 我希望能够将框架大小正确地设置为我指定的宽度和高度,并让面板向下移动一点以增加游戏文本的空间,这样它就不会阻塞任何东西。
基本上我很困惑和慌乱,我已经花了几天时间在这上面,但到目前为止我还没有成功。
JFrame 类:
public class main extends JFrame {
/**
* @param args the command line arguments
*/
public main(){
Board game = new Board();
setLayout(new BorderLayout(0, 50));
setSize(game.getGameWidth(), game.getGameHeight());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setTitle("BlockRunner");
getContentPane().add(game);
setResizable(false);
setVisible(true);
}
}
我的董事会类(class):
public class Board extends JPanel implements ActionListener, KeyListener{
private int width = 600;
private int height = 400;
Board(){
addKeyListener(this);
setFocusable(true);
setBackground(Color.LIGHT_GRAY);
setSize(width, height);
InitGame();
}
}
我愿意尝试任何有人愿意为我提供的东西。 感谢您的宝贵时间!
编辑 1:(由于用户的回答。) 使用 setPerferredSize()、setMinmumSize() 和 setMaximumSize() 不会影响结果。
最佳答案
您需要结合使用 getPreferred/Minimum/MaximumSize
和真正尊重它的布局。
在这里,我使用了一个 GridBagLayout
设置,这样面板将始终保持相同的大小,但单元格将使用相同的最大数量。
如果您想将文本保留在板的底部(而不是框架),请同时删除 weighty
约束(可能还有 weightx
)
public class TestBoardGame {
public static void main(String[] args) {
new TestBoardGame();
}
public TestBoardGame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
frame.add(new BoardGamePane(), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.fill= GridBagConstraints.HORIZONTAL;
JLabel text = new JLabel("Area for text");
text.setHorizontalAlignment(JLabel.CENTER);
frame.add(text, gbc);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BoardGamePane extends JPanel {
public BoardGamePane() {
setBorder(new LineBorder(Color.RED));
setBackground(Color.ORANGE);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
}
}
关于java - 在 JFrame 中使用 JPanel 无法正确调整大小或移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386508/