我有一个我无法处理的小错误。 我将 JPanel 的大小设置为 (150,90),但 PaintComponent() 中的代码显示其大小为 (160,100)。怎么了? 感谢您的时间和帮助。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test2 extends JPanel{
public static void main(String[] args) {
JFrame window = new JFrame("Test");
Test2 content = new Test2();
window.setContentPane(content);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocation(120,70);
window.pack();
window.setResizable(false);
window.setVisible(true);
}
Test2(){
setBackground( new Color(0,120,0) );
setPreferredSize( new Dimension(150, 90));
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor( Color.YELLOW);
g.drawRect(0, 0, 150, 90);
System.out.println(this.getWidth());
System.out.println(this.getHeight());
}
}
控制台输出表明大小为 (160,90)。黄色矩形显示相同。
最佳答案
window.pack();
window.setResizable(false);
应该是:
window.setResizable(false);
window.pack();
将窗口更改为不可调整大小会更改窗口的“ Chrome ”(外部的包装) - 它可能会变得更厚或更薄。如果我们在调用 pack 之前执行此操作,Swing 将正确处理更改后的镶边。
提示
- 参见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? (是的。)在这种情况下,
Test2
应覆盖首选大小方法。 - 要进行编译时检查,请添加
@Override
表示法。 - Swing GUI 应在事件分派(dispatch)线程上启动。如果不这样做可能会导致(偶尔)运行时错误和通常随机的行为。
关于java - JPanel SetPreferedSize 与实际大小不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252541/