【问题标题】:How to draw shape inside of JPanel that is inside JFrame如何在 JFrame 内的 JPanel 内绘制形状
【发布时间】:2020-09-22 13:40:41
【问题描述】:

我在使用 Netbeans GUI 添加的 JPanel 内绘制形状时遇到问题。现在,我不知道在哪里添加用于在该 JPanel 内绘制一个圆圈的代码,以及如何在现在空置的 JPanel 中插入和调用它,等待绘制这个形状。我已经将目标 JPanel 设置为 Flow 布局。 Netbeans Designer 创建了一个大类,其中我有这个 JPanel 的整个框架,我想将它保留在其中,因为我不能以任何其他方式添加它,因为 Designer 不允许我更改 main initComponents 方法,其中所有组件现在就坐。我一直在阅读教程和以前的帖子,但没有人真正使用 Netbeans Designer 遇到过这个问题。 所以有人可以帮我在这个框架类中添加正确的方法,以及如何从我想要绘制的 JPanel 中调用它。JPanel 是 50x50 像素。

所以按照@Abra,我更改了一些代码:

所以我创建了一个新的 Circle 类,并对其进行了一些调整,因为我不想创建一个新框架,而是将它放在 JPanel 中。

public class Circle extends JPanel {
Color color;
public void circle(Color color)    {
    this.color = color;
    setPreferredSize(new Dimension (30,30));
}
public void paintComponent(Graphics g)    {
    super.paintComponent(g);
    g.drawOval(0, 0, r, r);
    g.setColor(color);
}
private void showGUI() {
    JPanel panel = new JPanel();
    panel.add(this, FlowLayout.CENTER);
    panel.setVisible(true);
}       
}  
                                                                                                                        

然后我在 Designer 中打开 JPanel,并在 initComponents 方法中添加运行它的代码,如下所示:

circlePanel.setPreferredSize(new java.awt.Dimension(40, 40));
    new Circle().showGUI();
    PanelDS.add(circlePanel); 
                   

                                                      

circlePanel 是此绘图的目标,并且位于 PanelDS 本身内。它不能以这种方式工作,但 Netbeans 显示代码中没有错误。另外,如何将颜色转发给圆形类。

【问题讨论】:

  • 阅读 Custom Painting 上的 Swing 教程中的部分以获取基本的工作示例。对于更复杂的示例,您可以查看Custom Painting Approaches
  • 嗨@camickr,我读了所有这些,但我仍然不知道该把什么放在哪里,因为每个例子都有很多类,我担心我不能真正遵循,有没有一个优雅的解决方案?
  • 您对 Netbeans 设计器的依赖对您没有帮助。按照@camickr 链接的教程,学习编写自己的 Swing 组件。
  • @Dino,有没有优雅的解决方案? - 你已经得到了优雅的解决方案。从教程中的工作解决方案开始。然后,一旦您了解了它的工作原理,您就可以添加另一个功能并进行测试。当它起作用时,添加更多功能和测试。在测试之前不要尝试编写整个应用程序!

标签: java swing netbeans graphics jpanel


【解决方案1】:

为了使用JPanel,您需要覆盖JPanelpaintComponent() 方法。为了覆盖该方法,您需要创建一个扩展JPanel 的类。我认为不存在可以为您生成所需代码的 GUI 设计器。所以你必须编写扩展JPanel的类的代码。

这是一个最小的例子。它显示一个蓝色圆圈。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Drawing2 extends JPanel {
    private JFrame  frame;

    public Drawing2() {
        setPreferredSize(new Dimension(100, 100));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillOval(25, 25, 50, 50);
    }

    private void showGui() {
        frame = new JFrame("Drawing");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(this, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Drawing2().showGui();
    }
}

这是您在运行上述代码时应该看到的内容。

【讨论】:

  • 嗨@abra,我添加了一个代码来发布我为我的程序更改的代码,它仍然不起作用。
  • @Dino 如果你想让我为你调试你的代码,你需要发一个minimal reproducible example
  • 嗨@Abra,它是巨大的,我在netbeans 中将我的项目上传到了google Drive,如果你可以检查一下。 drive.google.com/file/d/1-Vv4LBaVxS1j44Xt4pZ01PVF8CLG-38T/…
  • @Dino,它很大, - 你为什么要编写一个庞大的程序来学习一个概念?当学习一个新概念时,先从小事开始,然后逐步积累。您已经获得了 Swing 教程的链接,其中包含一个工作示例和代码如何工作的说明。
  • @Dino,本教程中的代码还显示了创建 GUI 的正确方法。所有 GUI 组件都应在 EDT 上创建。这就是为什么我发布教程链接而不是创建一个简单的示例,这将复制教程中的内容。
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多