我正在开发俄罗斯方块以获得乐趣/了解有关Java的更多信息。我遇到了JFrame方面的问题。我有实际的游戏部分,它位于屏幕的左侧,右侧有得分,等级和高分。然后,在分数,水平和高分下我试图放入一个按钮。这是我的代码:
public class Tetris implements World {
boolean pause = false; // for pausing the game
boolean end = false; // for ending the game
static int score = 0; // score. Increments of 100
static int level = 1; // indicates level. Increments of 1.
static int highScore = 1000; // indicates the overall high score
static final int ROWS = 20; // Rows of the board
static final int COLUMNS = 10; // Columns of the board
Tetromino tetr, ghost, od1, od2, od3; // Tetr is the tetromino currently following. Ghost is the shadow blocks.
SetOfBlocks blocks; //SetOfBlocks on the ground
Tetris(Tetromino tetr, SetOfBlocks blocks) {
this.tetr = tetr;
this.blocks = blocks;
}
//Main Method
public static void main(String[] args) {
BigBang game = new BigBang(500, new Tetris(Tetromino.pickRandom(), new SetOfBlocks()));
JFrame frame = new JFrame("Tetris");
//JButton
JButton toggleGhost = new JButton("Toggle Ghost");
toggleGhost.setFont(new Font("default", Font.PLAIN, 10));
Dimension size = new Dimension(100, 25);
toggleGhost.setPreferredSize(size);
toggleGhost.setLocation(217, 60);
//frame
//frame.getContentPane().add( toggleGhost );
frame.getContentPane().add(game);
//frame.getContentPane().add( toggleGhost );
frame.addKeyListener(game);
frame.setVisible(true);
frame.setSize(Tetris.COLUMNS * Block.SIZE + 150, Tetris.ROWS * Block.SIZE + 120); // Makes the board slightly wider than the rows
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.start();
BigBang是一个扩展JComponent并主要处理Timer的类。如果我取消注释我将toggleGhost按钮添加到框架的部分,则它将占用整个框架。我已经尝试了许多不同的面板和容器替代品,但我似乎无法找到游戏和按钮显示的正确组合。
答案 0 :(得分:1)
因为您应该使用LayoutManager
。 setPreferredSize
不保证大小。
答案 1 :(得分:0)
如ACV所述,您在不使用JFrame
的情况下向LayoutManager
添加对象。如果您想要控制事物的显示方式(而不是在向帧中添加单个对象时),则应使用LayoutManager
。考虑BorderLayout
或BoxLayout
。
例如,使用BorderLayout
您必须添加以下代码:
frame.setLayout(new BorderLayout());
frame.add(game, BorderLayout.CENTER);
frame.add(toggleGhost, BorderLayout.SOUTH);
要了解setSize()
和setPreferedSize()
之间的区别,请参阅this question
最佳做法是向您正在使用的任何组件添加LayoutManager
(JFrame,JPanel,...)并使用setPreferedSize()
,setMinimumSize()
或setMaximumSize()
。