Есть ли способ нарисовать геометрические фигуры на JPanel формы, созданной в Intelli J Idea - PullRequest
0 голосов
/ 10 апреля 2019

Я только начал использовать Intelli J Idea, и один из моих первых проектов - построить некоторые геометрические формы для JPanel GUI, определенного в форме.В конце я хочу построить несколько графиков.Я нашел учебник, в котором был определен класс, расширяющий 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 в привязанном свойстве ничего не меняет.А также метод setBackgroundColor () ничего не меняет.

Знаете ли вы какие-либо учебные пособия или более подробное объяснение того, как это можно сделать?

РЕДАКТИРОВАТЬ: см. Ниже изображение компонентадерево. Дерево компонентов от Intelli J Идея

Спасибо и всего наилучшего, Дэвид

1 Ответ

2 голосов
/ 10 апреля 2019

Вы допустили много ошибок в своем коде.Я пытаюсь объяснить вам, что не так.

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

Пожалуйста, прочитайте также о менеджерах компоновки в Swing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...