Java AWT:设置Canvas的背景会改变整个帧的背景

时间:2015-05-11 16:58:38

标签: java canvas awt layout-manager

为什么更改java.awt.Canvas的背景颜色会改变整个画面的背景?

我按如下方式设置了一个Frame对象:

public class Gui extends Frame {

    public Gui() {

        setSize(800, 600);
        setLocation(0, 0);

        Canvas cd=new Canvas();
        cd.setSize(500, 300);
        cd.setBackground(Color.BLUE);
        add(cd);


        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent arg0) {
                System.exit(0);
            }

        });
    }

    @Override
    public void paint(Graphics g) {
        paintComponents(g);
    }

    public static void main(String[] args) {

        Gui g=new Gui();
        g.setVisible(true);

    }

}

上面的代码将帧大小设置为800x600,然后添加一个明显更小的画布 - 500x300,最后将背景颜色设置为Color.BLUE,而不是在更大的内部获得500x300的蓝色矩形,800x600窗框(默认为灰色),结果是800x600的蓝色背景框架:

enter image description here

文档说:

  

public void setBackground(Color c)

     

设置此组件的背景颜色。

     

背景颜色会不同地影响每个组件和部件   受背景颜色影响的组件可能会有所不同   在操作系统之间。

这可能是问题(我在Ubuntu上运行这个)? 或者我在这里错过了其他什么?

1 个答案:

答案 0 :(得分:1)

Frame的默认布局是BorderLayout(尽管使用基于AWT的Frame类的大量示例代码是在默认布局为{{1 }})。如果没有布局约束,添加到FlowLayout的组件将以BorderLayout约束结束,该约束会拉伸组件,使其适合可用的高度和宽度。

相反,我们可能会使用CENTER。当我们将一个组件添加到GridBagLayout而没有任何约束时,它将居中并且大小将被尊重。例如。 (参见代码中的进一步评论。)

Centered Canvas in Frame

GridBagLayout