java - 如何正确重写 awt Paint() 方法

标签 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

最佳答案

我建议阅读custom painting tutorial由 Oracle 提供。

首先,您应该使用框架,而不是窗口。使用 JFrame,这是 Swing 提供的用于创建框架的工具。 Swing 构建在 AWT 之上,更适合现代开发。

您应该创建一个新面板并重写它的paint方法,而不是重写框架的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);
    });
}

关于java - 如何正确重写 awt Paint() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34054721/

相关文章:

java - 将 JLabel 类绘制到另一个 JPanel 类时出现问题

java - Spring-Batch:读取多种格式的文件

java - 为当前线程禁用 Java 反射

java - 如何在控制台中显示从文件读取的方法?

java - 如何对某个区域内的非GUI对象实现MouseListener?

c++ - WinAPI C++ : Reprogramming Window Resize

java - 如何使用java删除csv文件中字符串之间的逗号

java - 防止 JavaFX 窗口窃取焦点

java - Swing 和 AWT 混合不好,但还是做了,为什么?

java - 使用线条创建填充桶工具