adi*_*ikh 2 java graphics swing paint jframe
我在JFrame构造函数中有以下简单代码
super(name);
setBounds(0,0,1100,750);
setLayout(null);
setVisible(true);
g = this.getGraphics();
int[] x =new int[]{65, 122, 77, 20, };
int[] y =new int[]{226, 258, 341, 310};
g.setColor(Color.RED);
g.drawPolygon (x, y, x.length);
System.out.println(g);
Run Code Online (Sandbox Code Playgroud)
我在控制台上获得输出:
sun.java2d.SunGraphics2D [字体= java.awt.Font中[家族=对话框,名称=对话框,风格=平原,大小= 12],颜色= java.awt.Color中[R = 255,G = 0,B = 0 ]]
但是在JFrame上没有绘制红色多边形,而只是空白JFrame.
为什么?
不要覆盖paint(..)在JFrame
而是添加自定义 JPanel与重写paintComponent(Graphics g)到JFrame
不要使用Null/ AbsoluteLayout 使用合适的LayoutManager
不要叫setBounds(..)上JFrame实例(均不表明其不允许的,但不能看到它是在该应用程序相关的)
别忘了使用EDT创建和更改GUI组件:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test test = new Test();
}
});
Run Code Online (Sandbox Code Playgroud)你会做这样的事情:
public class Test {
/**
* Default constructor for Test.class
*/
public Test() {
initComponents();
}
public static void main(String[] args) {
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test test = new Test();
}
});
}
/**
* Initialize GUI and components (including ActionListeners etc)
*/
private void initComponents() {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(new MyPanel());
//pack frame (size JFrame to match preferred sizes of added components and set visible
jFrame.pack();
jFrame.setVisible(true);
}
}
class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int[] x = new int[]{65, 122, 77, 20};
int[] y = new int[]{226, 258, 341, 310};
g.setColor(Color.RED);
g.drawPolygon(x, y, x.length);
}
//so our panel is the corerct size when pack() is called on Jframe
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}
Run Code Online (Sandbox Code Playgroud)
产生:

| 归档时间: |
|
| 查看次数: |
15721 次 |
| 最近记录: |