Java 框架问题

Java Frame problems

我正在为 fun/to 开发俄罗斯方块,详细了解 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 是一个 class,它扩展了 JComponent 并主要处理 Timer。如果我取消注释将 toggleGhost 按钮添加到框架的部分,那么它会占据整个框架。我已经尝试过许多不同的面板和容器替代方案,但我似乎无法找到游戏和按钮显示的正确组合。

因为你应该使用 LayoutManagersetPreferredSize 不保证大小。

ACV 所说,您在不使用 LayoutManager 的情况下向 JFrame 添加对象。当您想要控制事物的显示方式时(而不是在将单个对象添加到框架时),您应该使用 LayoutManager。考虑 BorderLayoutBoxLayout

例如,使用 BorderLayout 您必须添加以下代码:

frame.setLayout(new BorderLayout());
frame.add(game, BorderLayout.CENTER);
frame.add(toggleGhost, BorderLayout.SOUTH);

要了解 setSize()setPreferedSize() 之间的区别,请参阅 this question
最佳做法是向您正在使用的任何组件(JFrame、JPanel 等)添加 LayoutManager 并使用 setPreferedSize()setMinimumSize()setMaximumSize().