如何正确覆盖 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
,因为它扩展了Window
(JFrame
is aWindow
)
好的,我明天去看看。当我认为我也可以在那里覆盖 paint() 时,我是对的吗?以上是关于如何正确覆盖 awt paint() 方法的主要内容,如果未能解决你的问题,请参考以下文章
java.awt.Label 派生类的paint(Graphics g) 方法未调用