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

Posted

技术标签:

【中文标题】如何正确覆盖 awt paint() 方法【英文标题】:how do I override awt paint() method correctly 【发布时间】:2016-03-07 09:38:05 【问题描述】:

我有一个来自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

【问题讨论】:

@VinceEmigh 感谢您的更正 您在另一条评论中提到您正在使用 vlcj,在 vlcj 测试源中有一些您正在尝试做什么的示例。 github.com/caprica/vlcj/blob/master/src/test/java/uk/co/caprica/… 【参考方案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);
    );

【讨论】:

感谢您的帮助。我在我的应用程序中使用 VLCj,EmbeddedMediaPlayer 类支持 Window 访问器以将 Overlays 放置在视频上方。这就是我必须使用 java.awt.Window 的原因;)。如果您有任何解决办法,我将不胜感激。 如果它接受Window,它将接受JFrame,因为它扩展了WindowJFrameis aWindow 好的,我明天去看看。当我认为我也可以在那里覆盖 paint() 时,我是对的吗?

以上是关于如何正确覆盖 awt paint() 方法的主要内容,如果未能解决你的问题,请参考以下文章

发布覆盖java中组件的paint方法

java.awt.Label 派生类的paint(Graphics g) 方法未调用

AWT 标签/按钮/文本字段 + 油漆?

如何在小程序外部paint()方法中打印

Java - 覆盖 >variable< 中的paint(Graphics g) 方法

挂钩时覆盖窗口未正确绘制