2015-12-02 75 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