有没有办法在Intelli J Idea中创建的表单的JPanel上绘制几何形状

时间:2019-04-10 12:21:05

标签: java swing intellij-idea

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

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对象保存到bound属性不会更改任何内容。 而且setBackgroundColor()方法不会更改任何内容。

您知道如何进行此操作的任何教程或更详细的说明吗?

编辑:请在下面找到组件树的图像。 Component tree from Intelli J Idea

感谢和亲切的问候, 大卫

1 个答案:

答案 0 :(得分:2)

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

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

也请阅读有关layout managers in Swing

的信息