【问题标题】:Java JFrame Opens too smallJava JFrame 打开太小
【发布时间】:2016-02-02 21:49:08
【问题描述】:

我正在尝试在 Java 中创建 PingPong,但是在为球创建边界时遇到了麻烦。经过测试,发现JFrame打开的太小了;我将宽度设置为 500,JFrame 以 484 像素打开。这是为什么呢?

这是我的游戏课:

公共类游戏扩展画布{

public static void main(String[] args){
    new Game();
}

Display d;


public Game(){
    d = new Display(this);
    requestFocus();
}


public void start(){
    System.out.println("Game started.");
}
public void stop(){

}


public void paint(Graphics g){
    g.setColor(Color.DARK_GRAY);
    g.fillRect(0, 0, 500, 400);
    g.setColor(Color.GREEN);
    g.drawLine(483, 0, 483, 399);
    g.drawLine(0, 399, 499, 399);
}

}

这是我的 JFrame 类:

公共类 Display 扩展 JFrame {

JFrame frame;
Dimension screenSize;

public Display(Game game){
    frame = new JFrame("PingPong");
    screenSize = new Dimension(500, 400);



    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(true);
    //frame.setSize(500, 400);
    frame.setPreferredSize(screenSize);
    frame.setMinimumSize(screenSize);
    frame.setMaximumSize(screenSize);

    frame.setLocationRelativeTo(null);
    frame.add(game);
    //frame.pack();
    game.start();

}

}

【问题讨论】:

    标签: java jframe


    【解决方案1】:

    当您在JFrame 上调用setSize 时,它包括标题栏的大小以及窗口周围的任何其他装饰。因此,您拥有的实际可绘制区域会比这要少一些。您可以通过设置Game 的首选大小并在JFrame 上使用pack 来解决此问题。

    因此,如果您将代码更改为:

    public Display(Game game){
        super("PingPong");
        screenSize = new Dimension(500, 400);
    
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(true);
        game.setPreferredSize(screenSize);
    
        setLocationRelativeTo(null);
        add(game);
        pack();
        setVisible(true);
        game.start();
    }
    

    它会起作用的。这会告诉您的实际游戏它想要的大小(500x400),然后调整帧大小以使其完全包含它。这将为您在实际绘图中提供 500x400 像素。

    请注意,我删除了所有 frame 引用。由于Display 本身已经是JFrame,因此您无需再创建一个。只需使用 Display 对象本身。

    【讨论】:

    • 我该怎么做呢?我对 java 中的游戏开发相当陌生
    • @Lol:看看这个Stackoverflow answer。这不是乒乓球,但它向您展示了如何在 Java Swing 中正确绘图。另外,请查看 Oracle 的 Performing Custom Painting 以查看另一个示例。
    • @Lol 这很容易。查看您的代码,我发现您实际上已经非常接近了。您只需将frame.setPreferredSize(screenSize) 更改为game.setPreferredSize(screenSize),注释掉setMinimumSize 和setMaximumSize 行,并取消注释frame.pack()。我会在我的答案中添加它的样子。
    【解决方案2】:

    只需删除frame.pack() 即可。

    【讨论】:

    • 您好,欢迎来到 SO!请阅读tour 和How do I write a good answer? 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多