java - JPanel 和 JFrame 大小不变

标签 java swing jframe jpanel size

我正在用 Java 制作一个游戏,首先我没有使用 JPanel,它会导致 repaint() 上闪烁,所以我决定使用它。我不确定如何在我当前的代码中实现它。当我尝试这样做时,我得到的只是一个尽可能小的窗口。我原来的Window类代码:

public class Window extends JFrame {
private double stepLen;

public Window(double stepLen) {
    this.stepLen = stepLen;

    this.setSize(800, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);
    this.setTitle("Frogger");
    this.setLayout(null);

    getContentPane().setBackground(Color.black);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (dim.width - this.getSize().width)/2;
    int y = (dim.height - this.getSize().height)/2;

    this.setLocation(x, y);

    JLabel goal = new JLabel();
    goal.setText("|=========|");
    goal.setForeground(Color.WHITE);
    goal.setFont(new Font("Seif", Font.PLAIN, 20));
    add(goal);
    goal.setBounds(325, -10, 600, 50);

    setFocusable(true);
    requestFocusInWindow();

    this.setVisible(true);
}

此代码有效并创建了一个窗口。 主类:

Window window = new Window(50);

然后我尝试这样做: 我有单独的 GameFrame (JFrame) 和 GameCanvas (JPanel) 类。 框架如下所示:

public class GameFrame extends JFrame{
private double stepLen;

public GameFrame() {
    this.stepLen = 50;

    this.setSize(800, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);
    this.setTitle("Frogger");
    this.setLayout(null);
    this.setVisible(true);

    this.getContentPane().setBackground(Color.black);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (dim.width - this.getSize().width)/2;
    int y = (dim.height - this.getSize().height)/2;

    GameCanvas gcanvas = new GameCanvas();
    this.add(gcanvas);
    this.pack();

    this.setLocation(x, y);

}

}


}

以及 GameCanvas 类

public class GameCanvas extends JPanel {
public GameCanvas() {
    setDoubleBuffered(true);
    JLabel goal = new JLabel();
    goal.setText("|=========|");
    goal.setForeground(Color.WHITE);
    goal.setFont(new Font("Seif", Font.PLAIN, 20));
    this.add(goal);
    goal.setBounds(325, -10, 600, 50);

    this.getPreferredSize();

    this.setVisible(true);

    this.repaint();
}

最佳答案

Camickr 是正确的 - 投票并将他的答案标记为正确,这只是为了避免他拔掉剩下的一点头发

  • 您正在使用 null 布局,但没有接管其责任
  • 无法为组件提供大小调整提示,以允许布局管理器(您不再使用)完成其工作

这些都是常见错误,已经提供了无数答案

游戏框架

public class GameFrame extends JFrame {

    private double stepLen;

    public GameFrame() {
        this.stepLen = 50;

        this.setSize(800, 600);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setTitle("Frogger");
        // Well, there's your problem...
        //this.setLayout(null);
        // Don't do this here...
        this.setVisible(true);

        this.getContentPane().setBackground(Color.black);

        // Simpler way to achieve this
        //Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        //int x = (dim.width - this.getSize().width) / 2;
        //int y = (dim.height - this.getSize().height) / 2;

        GameCanvas gcanvas = new GameCanvas();
        this.add(gcanvas);
        this.pack();

        //this.setLocation(x, y);

        setLocationRelativeTo(null);
        setVisible(true);

    }

}

游戏 Canvas

public class GameCanvas extends JPanel {

    public GameCanvas() {
        // Pointless
        //setDoubleBuffered(true);
        JLabel goal = new JLabel();
        goal.setText("|=========|");
        goal.setForeground(Color.WHITE);
        goal.setFont(new Font("Seif", Font.PLAIN, 20));
        this.add(goal);
        // Pointless
        //goal.setBounds(325, -10, 600, 50);

        // Pointless
        //this.getPreferredSize();
        // Pointless
        //this.setVisible(true);
        // Pointless
        //this.repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }

    @Override
    public void paintComponent(Graphics g) {

        int firstRoad = 5;
        int i = 0;
        int max = 10;

        Graphics2D g2 = (Graphics2D) g;

        super.paintComponent(g2);
        g2.setColor(Color.WHITE);
        g2.drawRect(5, 30, 75, 40);

        while (i < max) {
            g2.setColor(Color.WHITE);
            g2.setStroke(new BasicStroke(3));

            if (i % 2 == 0) {
                g.setColor(Color.WHITE);
                g.drawRect(3, firstRoad + 50 * i, 793, 50);
                //g.fillRect(3, firstRoad + 50 * i, 793, 50);
            } else {
                g2.setColor(Color.WHITE);
                g2.drawRect(3, firstRoad + 50 * i, 793, 50);
            }
            i++;
        }
    }
}

关于java - JPanel 和 JFrame 大小不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739648/

相关文章:

java - JFrame、JPanel 和 Gridlayout 问题

java - 如何使用 Java 客户端更新 Elastic Search 上的条目

java - 从宏运行 OrientationJ 时,是什么原因导致 "multiple points exception"?

java - 如何将jtable的内容复制到剪贴板

Java:如何在 JTree 中显示 XML 文件

java - 我有一些关于 jframe 和 jlabel 的问题?

java.lang.IllegalStateException : This feature is only available to backend instances 错误

java - 如何在Java中添加计数器?

java - 使用 invokeLater 后 Swing UI 未更新

java - 设置Java 2D绘图在TitleBar之后开始