【问题标题】:Java - JPanel won't show up on JFrame when overriding JFrame's paintJava - 覆盖 JFrame 的绘制时,JPanel 不会出现在 JFrame 上
【发布时间】:2011-04-15 08:00:33
【问题描述】:

我有一个 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);
    }
}

【问题讨论】:

  • 和之前/之后“//在这里画一些……”你当然有super.paint(g);,对吧?
  • 不,我既是智障,又是 Java 新手…… super.paint(g); 是什么?无论如何?
  • @tybro0103,它将调用基本行为(框架的正常行为来绘制其内容)——就像您在面板中拥有super.paintComponent(g);一样。
  • 谢谢,我仍然得到相同的结果。
  • @tybro0103,以您的示例为例,您可能应该将super.paint(g); 放在方法的末尾(在您自己的自定义绘画之后)。这会改变肤色吗?

标签: java swing graphics awt jframe


【解决方案1】:

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

应始终通过覆盖 Swing 组件的 paintComponent() 方法来完成自定义绘制,就像在 NoteDraw 面板上所做的那样。

paint 方法中的代码不显示的原因是 NoteDraw 面板是不透明的,因此该面板会在您的 paint 方法中的 Graphics 代码之上进行绘制。

所以解决方法是将Graphics绘画代​​码移到NoteDraw面板。

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

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

【讨论】:

    【解决方案2】:

    当您覆盖 paint() 方法时,记得调用 super.paint()

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


    资源:

    【讨论】:

    • 谢谢,前面的评论中提到过,但这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多