java JFrame图形

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.

为什么?

Dav*_*amp 7

  • 不要覆盖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)

产生:

在此输入图像描述