2015-12-02 154 views
0

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

的问题是,我不知道如何正确地调用重绘。一切都已实施,我相信它的工作原理,因为如果我打开一个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 
+0

为校正 – Criska

+0

您在另一评论提到,你正在使用@VinceEmigh感谢vlcj,在vlcj测试源中,有一些正是你想要做的事情的例子。 https://github.com/caprica/vlcj/blob/master/src/test/java/uk/co/caprica/vlcj/test/overlay – caprica

回答

1

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

首先,你应该使用一个框架,而不是一个窗口。使用JFrame,这是Swing为创建框架提供的。 Swing建立在AWT的顶部,并为现代发展打下基础。

而不是覆盖框架(框架绘画)的paint(Graphics),你应该创建一个新的面板和覆盖它的paint方法。它也建议重写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); 
    }); 
} 
+0

感谢您的帮助。我在我的应用程序中使用VLCj,并且'EmbeddedMediaPlayer'类支持一个Window访问器来将Overlays放置在视频上方。这就是为什么我必须使用java.awt.Window;)。我有任何想法解决,我会很感激。 – Criska

+0

如果它接受'Window',它将接受'JFrame',因为它扩展了'Window'(一个'JFrame' [是]](https://en.m.wikipedia.org/wiki/Is-a)'窗口') –

+0

好的,我会明天检查。我认为我也可以重写paint()吗? – Criska