用Java绘图

时间:2013-07-25 05:19:35

标签: java swing layout graphics jpanel

您好我正在尝试使用JavapaintComponent对象在Graphics中做一些绘图示例。我需要一个固定大小的'舞台'(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]

但结果如下:
enter image description here

黑色部分 400x300 ..不确定此额外间距来自何处。
我尝试了setSize setPreferredSize和布局的几种变体......但没有真正有效。

P.S任何java fiddle out?

3 个答案:

答案 0 :(得分:4)

//this.pack();
this.setResizable(false);
this.pack();

答案 1 :(得分:3)

两件事。

  1. pack之后致电setResizable。这是一个(不常见的)已知错误
  2. 不要依赖魔术数字。您应尽可能使用已知值。如果您决定稍后更改这些值,这将使您的生活更轻松。
  3. 例如,您应该使用g.fillRect(0, 0, 400, 300);

    而不是g.fillRect(0, 0, getWidth(), getHeight());

答案 2 :(得分:2)

在这种情况下,我认为最好使用BufferedImage作为绘画表面,只需在JLabel中显示它。在this answer中可以看到一个简单的(动画)示例。