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);
}
}