Java - JPAnel在重写JFrame的绘制时不会出现在JFrame上

时间:2010-09-21 17:18:51

标签: java swing graphics awt jframe

我有一个JFrame,我正在使用它覆盖paint方法来显示一些图形。我还想为它添加一个JPanel,它将显示在图形之上。现在,我看到的是从JFrame绘制方法创建的图形。

这是我的JPanel:

public class NoteDraw extends JPanel {

    public NoteDraw() {
        setSize(200, 100);
        setBackground(Color.BLACK);
    }

    @Override public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(0, 0, 100, 100);
    }
}

这是我的JFrame:

public class ui extends JFrame {
    public void paint(Graphics g) {
        //do some drawing here...
    }
}

这是我的主要内容:

public class Main {
    static ui main_gui = new ui();

    public static void main(String[] args) {
        NoteDraw note = new NoteDraw();
        main_gui.getContentPane().add(note);
        main_gui.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:1)

你永远不应该覆盖JFrame的paint()方法(除非你真的知道你在做什么)。此方法负责Swing的所有优化绘制行为。

自定义绘画应始终通过重写Swing组件的paintComponent()方法来完成,就像在NoteDraw面板上完成一样。

paint方法中的代码未显示的原因是因为NoteDraw面板是不透明的,因此面板绘制了paint方法中图形代码的顶部。

因此解决方案是将Graphics绘图代码移动到NoteDraw面板。

或者,如果您尝试为框架创建某种背景图像,则可以尝试使用Background Panel

或者如果你确实需要自定义绘画,那么你创建一个背景面板并覆盖paintComponent()方法。然后将布局设置为BorderLayout并将此面板添加到框架中。然后,将NoteDraw面板设置为非透明,并将其添加到自定义背景面板。现在,背景将在NoteDraw面板上显示。

答案 1 :(得分:-1)

请务必在覆盖super.paint()方法时致电paint()

这样,您仍然可以使用父类中定义的行为,并且可以安全地添加修改。


资源: