2

您好我正在尝试Java使用paintComponentGraphics对象做一些绘图示例。我需要一个固定尺寸的“舞台”(400x300)用于绘图和window/frame “围绕它”

这是我的设置:

public class MyJFrame extends JFrame{    
    public MyJFrame(){
        //setSize(new Dimension(400,300));
        setBackground(Color.green);
        Stage stage = new Stage();
        add(stage);
        
        this.pack();
        this.setResizable(false);
        this.setVisible(true);
        
        System.out.println(this.size());
        System.out.println(stage.size()); 
    }
}

public class Stage extends JPanel {
    
    public Stage(){
        setPreferredSize(new Dimension(400,300));
        //setSize(new Dimension(400,300)); 
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, 400, 300); 
    }
}

打印出来的是:

java.awt.Dimension[width=416,height=338]
java.awt.Dimension[width=400,height=300]

但结果如下所示:
在此处输入图像描述

黑色部分是400x300 .. 不知道这个额外的间距是从哪里来的。
我尝试了几种setSize setPreferredSize布局和布局..但没有任何效果。

PS那里有任何java小提琴吗?

4

3 回答 3

4
//this.pack();
this.setResizable(false);
this.pack();
于 2013-07-25T05:21:26.677 回答
3

两件事情。

  1. pack在你之后打电话setResizable。这是一个(不常见的)已知错误
  2. 不要依赖幻数。您应该尽可能使用已知值。如果您以后决定更改这些值,这将使您的生活更轻松。

例如,而不是g.fillRect(0, 0, 400, 300);你应该使用g.fillRect(0, 0, getWidth(), getHeight());

于 2013-07-25T05:24:11.567 回答
2

在这种情况下,我认为您最好使用 aBufferedImage作为油漆表面并简单地将其显示在 a 中JLabel在这个答案中可以看到一个简单的(动画)示例。

于 2013-07-25T06:08:40.697 回答