如何正确覆盖awt paint()方法

时间:2015-12-02 22:59:03

标签: java awt paint repaint

我有java.awt.Window的子类。在这个子类中,我想覆盖public void paint(Graphics g)函数来绘制我自己的东西。

问题是我不知道如何正确调用重绘。一切都已实施,我确信它有效,因为如果我打开FileChooser并关闭它java.awt.Window重新绘制,并在其上显示正确的内容。

但如果我自己调用对象的repaint()方法,则不会重新绘制。

您是否知道我如何正确调用重绘?

public class MyWindow extends java.awt.Window {
    public MyWindows(Window owner) {
        super(owner);
    }
    public void paint(Graphics g) {
        g.fillRect(50,50,50,50);
    }
}

MyWindow window = new MyWindow(owner);
window.repaint(); //this call the paint method but dont show drawn things

1 个答案:

答案 0 :(得分:1)

我建议您阅读Oracle提供的custom painting tutorial

首先,你应该使用一个框架,而不是一个窗口。使用JFrame,这是Swing为创建框架提供的内容。 Swing建立在AWT之上,适用于现代开发。

您应该创建一个新面板并覆盖它的绘制方法,而不是覆盖框架的paint(Graphics)(在框架上绘画)。它还建议覆盖paintComponent而不是paint

class MyPanel extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        //paint
    }
}

然后,您可以将此面板添加到您的框架中:

public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
        JFrame frame = new JFrame();
        JPanel panel = new MyPanel();
        panel.setSize(...);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    });
}