Java 有没有一种方法可以在Intelli J Idea中创建的表单的JPanel上绘制几何图形

Java 有没有一种方法可以在Intelli J Idea中创建的表单的JPanel上绘制几何图形,java,swing,intellij-idea,Java,Swing,Intellij Idea,我刚开始使用Intelli J Idea,我的第一个项目之一是将一些几何图形绘制到表单中定义的GUI的JPanel上。最后我想画一些图表。我找到了一个教程,其中定义了一个扩展JPanel的类,并重载了paintComponent()方法 public class MyPanel extends JPanel{ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics

我刚开始使用Intelli J Idea,我的第一个项目之一是将一些几何图形绘制到表单中定义的GUI的JPanel上。最后我想画一些图表。我找到了一个教程,其中定义了一个扩展JPanel的类,并重载了paintComponent()方法

public class MyPanel extends JPanel{
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        int y2 = (int)(40 * Math.random());
        Line2D  line = new Line2D.Double(10, 10, 60, y2);
        Rectangle2D rectangle = new Rectangle2D.Double(200, 120, 70, 30);
        Ellipse2D oval = new Ellipse2D.Double(400, 200, 40, 60);
        g2.draw(line);
        g2.setPaint(Color.RED);
        g2.fill(rectangle);
        g2.setPaint(Color.ORANGE);
        g2.fill(oval);
    }
}
如果我将其与以下代码一起使用,则运行良好:

public class MainClass {
    public static void main(String[] args) {
        MyPanel s = new MyPanel();
        JFrame f = new JFrame();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600, 400);
    }
}
然后我尝试将它与我使用Intelli J Idea创建的表单相结合。这就是我的问题所在。我想要一张带按钮和JPanel的表格。当我按下按钮时,一些几何图形正在表格中定义的JPanel上绘制。我认为我最好的尝试是这样的:

public class MainWindow {
    private JPanel panelMain;
    private JButton buttonCalculate;
    private JPanel panelPlot;

    public MainWindow() {
        buttonCalculate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panelPlot = new MyPanel();
                panelPlot.setBackground(Color.CYAN);
                panelPlot.setSize(200, 200);
                panelPlot.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("MyFirstGraphTool");
        f.setContentPane(new MainWindow().panelMain);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600, 400);
        f.setVisible(true);
    }
}
但是简单地将派生的JPlane对象保存到绑定属性不会改变任何东西。 而且setBackgroundColor()方法不会改变任何东西

你知道如何做的任何教程或更详细的解释吗

编辑:请在下面找到组件树的图像。

谢谢和亲切的问候,
David

您在代码中犯了很多错误。我试着向你解释,怎么了

public class MainWindow {
    private JPanel panelMain; // panelMain is not initialized, so when you try to add it to any window/panel, you'll get a NullPointerException
    private JButton buttonCalculate; // same as before. Also this button is not added to any container (window/panel)
    private JPanel panelPlot; // panel is not added to any container

    public MainWindow() {
        buttonCalculate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panelPlot = new MyPanel();
                panelPlot.setBackground(Color.CYAN);
                panelPlot.setSize(200, 200); // this code will not be honored because the layout manager will recalculate panel bounds.
                                             // use setPreferredSize instead.
                panelPlot.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("MyFirstGraphTool");
        f.setContentPane(new MainWindow().panelMain);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600, 400);
        f.setVisible(true);
    }
}
这是你们班的正确版本

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * <code>MainWindow</code>.
 */
public class MainWindow {
    private JPanel panelMain = new JPanel();

    private JButton buttonCalculate = new JButton("Calculate");

    private JPanel panelPlot; // panel is not added to any container

    public MainWindow() {
        buttonCalculate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panelPlot = new MyPanel();
                panelPlot.setOpaque(true);
                panelPlot.setBackground(Color.CYAN);
                panelPlot.setPreferredSize(new Dimension(200, 200));
                panelMain.add(panelPlot);
                panelMain.revalidate(); // cause layout manager to recalculate component bounds
            }
        });
        panelMain.add(buttonCalculate);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("MyFirstGraphTool");
        f.setContentPane(new MainWindow().panelMain);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600, 400);
        f.setVisible(true);
    }

    static class MyPanel extends JPanel {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            int y2 = (int) (40 * Math.random());
            Line2D line = new Line2D.Double(10, 10, 60, y2);
            Rectangle2D rectangle = new Rectangle2D.Double(200, 120, 70, 30);
            Ellipse2D oval = new Ellipse2D.Double(400, 200, 40, 60);
            g2.draw(line);
            g2.setPaint(Color.RED);
            g2.fill(rectangle);
            g2.setPaint(Color.ORANGE);
            g2.fill(oval);
        }
    }
}

还请阅读关于

您从未将
panelPlot
添加到任何容器中的内容。我添加了Intelli J组件树的图像。因此,如果我没有弄错,panelPlot应该位于panelMain中。还是我必须以某种方式将它们添加到代码中?编辑:由于我刚开始使用Intelli J,并且没有太多使用Java和GUI的经验,可能是我遗漏了一些琐碎的东西。谢谢你的回答。但是我仍然不知道如何使用我在Intelli J的GUI中设计的布局。因为属性panelMain、buttonCalculate和panelPlot来自绑定到此类的Intelli J表单。通过使用“panelMain=newjpanel()”重新初始化它们,我失去了设计,不得不在代码中再次添加所有组件。也许我根本不应该使用图形化GUI编辑器,而应该在代码中完成所有工作。@Ragnos问题是,UI设计人员非常严格,只理解自己创建的UI。你不能设计一个UI,改变它的内容(就像我在我的解决方案中所做的那样)。我和Swing一起工作了18年,更新的版本使用了任何设计师(好吧,当我刚开始的时候,他们很糟糕)。谢谢,我想我会自己用代码来制作UI。看起来不太复杂。在那里找到了解决我问题的方法: