【问题标题】:how do I override awt paint() method correctly如何正确覆盖 awt paint() 方法
【发布时间】: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

【问题讨论】:

标签: java awt paint repaint


【解决方案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() 时,我是对的吗?
猜你喜欢
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
相关资源
最近更新 更多