Java Swing打包窗口错误

3
我正在使用Java制作类似于“烧毁的地球”的游戏(用于我的考试项目:D),但我遇到了这个问题。我正在绘制一个窗口(JFrame),将布局设置为BorderLayout,应用一个扩展的JPanel,并对窗口进行打包,但是在打包后,它在左侧和底部边框处显示了一些扩展的白色空间。
这是我的主类:
public class Main {
    public static void main(String[] args) {
        javax.swing.JFrame frame = new javax.swing.JFrame("game title");
        panel p = new panel(new java.awt.Dimension(512, 512));
        frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new java.awt.BorderLayout());
        frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}

panel是我的JPanel类,在构造函数中将其首选大小设置为参数(512x512)。我在Windows和Linux上进行了测试,两个地方都出现了错误,并且白色间隙的大小因操作系统而异。

这是我的面板类:

class panel extends javax.swing.JPanel{
    panel(java.awt.Dimension size){
        setPreferredSize(size);
    }
    public void paint(java.awt.Graphics g){
        g.setColor(java.awt.Color.BLUE);
        g.fillRect(0, 0, 512, 512);
    }
}

Please help!


你没有告诉我们关于你的面板类。它是做什么的?构造函数参数是做什么的?你能将问题简化为SSCCE吗?http://www.sscce.org/ - Joachim Sauer
我看不出您对所提供的Panel类有什么问题。而且您在两个地方都将面板的首选大小硬编码,这是重复自己。不要那样做! - Joachim Sauer
1
我有一个大小变量,它包含窗口的大小,我使用它来设置矩形的大小,这里为了简单起见将其删除了。 - Xunil
4个回答

3

我尝试在没有您的panel类的情况下复现这个问题(该类需要一个更好的名称,并且至少应该使用驼峰命名法命名):

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("game title");
        JPanel p = new JPanel();
        p.setPreferredSize(new java.awt.Dimension(512, 512));
        p.setBackground(java.awt.Color.BLUE);
        frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new java.awt.BorderLayout());
        frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}

这将产生一个带有蓝色512x512面板的窗口,没有不同颜色的边框。因此问题必须出在你的panel类上。


522x522是什么?窗口还是面板?我的面板大小恰好为512x512,而窗口显然比它大一些。 - Joachim Sauer
这是一个尺寸为522x522的面板。 - Xunil

3

saua,

虽然这不是你要求的,但这很重要...在swing中,你不应该覆盖paint方法,而是应该覆盖paintComponent方法。

请参阅Sun公司的“自定义绘图”教程:http://java.sun.com/docs/books/tutorial/uiswing/painting/

事实上,我强烈建议(考虑到你的项目选择)你完成整个Swing教程。虽然需要一些时间,但这是值得的。

祝好。Keith。


2

我通过删除以下内容解决了这个问题:

setResizable(false);

1
我曾经遇到过同样的问题,并通过删除setResizable方法来解决它。但是还有其他方法可以防止窗口被调整大小吗? - fjsj

1

我已经查看了 setResizable() 的代码,并且确定一切都是正确的。只需要在 this.pack() 之前加上 this.setResizable(false)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接