JavaAWT:设置画布的背景会更改整个帧的背景

JavaAWT:设置画布的背景会更改整个帧的背景,java,canvas,awt,layout-manager,Java,Canvas,Awt,Layout Manager,为什么更改背景颜色会更改整个帧的背景 我设置了一个框架对象,如下所示: 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);

为什么更改背景颜色会更改整个帧的背景

我设置了一个框架对象,如下所示:

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
,但不是在更大的800x600窗口框架内获得一个500x300蓝色矩形(默认为灰色),结果是一个800x600帧,背景为蓝色:

文件说:

公共空地(c色)

设置此组件的背景色

背景色对每个组件和零件的影响不同 受背景颜色影响的组件的颜色可能不同 在操作系统之间

这可能是问题所在吗(我在Ubuntu上运行这个)?

或者我在这里遗漏了什么?

框架的默认布局是
BorderLayout
(尽管许多使用基于AWT的
Frame
类的示例代码是在默认布局是
FlowLayout
的时候编写的)。如果没有布局约束,添加到
BorderLayout
中的零部件最终将位于
中心
约束中,该约束将拉伸零部件,使其适合可用的高度和宽度

相反,我们可以使用
GridBagLayout
。当我们将单个组件添加到
GridBagLayout
中而不受任何约束时,它将居中,并且大小将得到考虑。例如(参见代码中的进一步注释)


不要指望在去润滑的东西上得到任何帮助,他们甚至不再在大学里教他们了。为什么要用AWT?请参阅,了解放弃AWT使用组件而支持Swing的许多好理由。我使用AWT是因为我需要使用JFreeChart(),据我所知,JFreeChart()只支持AWT组件……什么是“基于AWT/Swing的GUI应该在EDT上启动”?您的意思是它必须在单独的线程上运行吗?有关更多详细信息,请参阅&尤其是。
import java.awt.*;
import java.awt.event.*;

public class Gui extends Frame {

    public Gui() {
        setSize(400, 200);
        setLocationByPlatform(true);
        setLayout(new GridBagLayout());

        Canvas cd=new Canvas();
        // TODO: Override rather than set & make it preferred rather than actual
        cd.setSize(300, 100); 
        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); // wrong method!
        super.paint(g); // right method, but does nothing different to original!
    }

    public static void main(String[] args) {
        // TODO: AWT/Swing based GUIs should be started on the EDT
        Gui g=new Gui();
        g.setVisible(true);
    }
}