Java - 覆盖 JFrame 的绘制时,JPanel 不会显示在 JFrame 上

标签 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);
    }
}

最佳答案

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

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

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

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

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

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

关于Java - 覆盖 JFrame 的绘制时,JPanel 不会显示在 JFrame 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762750/

相关文章:

java - 如何在 Java 中控制帧外的各个像素?

android - 在 android 中绘制大型数据集的标准做法

java - 在java中调用动态构造函数?

java - Java从csv文件读取数据

java - 从后台线程更新缓冲图像

java - 来自 Java 代码的 Java Swing 上的 CSS

java - JPanel及组件自动改变位置

java - 在 Java 中定义公共(public)库接口(interface)

Java游戏无法运行

c# - 如何在数据 GridView 中制作这种(引用图像)类型的图形