java - 如何多次在第二个窗口而不是另一个打开的窗口上获取结果?

标签 java swing jframe

我想做一个简单的加法程序。在其中,我想将变量从 Main_Window 传递到 Second_Window 进行添加,并且我想多次在 Second_Window 上获取结果。意味着如果我从 Main_Window 多次传递变量进行加法,那么结果应该在 Second_Window 上,而不是第三和第四个 Window 上。

在这里,我希望所有更改都应显示在 Second_Window 上,而不是打开时的另一个窗口上。

Here I want All changes should be show on <code>Second_Window</code> not another on open.

这些行是为了从 Main_Window 传递变量而编写的。

Second_Window s = new Second_Window(a,b);
s.setVisible(true);

最佳答案

我将从我的 previous answer 中获取代码将您的问题之一作为我的基本代码并为其添加一些功能:

首先,您需要创建第二个窗口的一个且仅有一个实例,并拥有一种可以更新发送给它的角度的方法。

您可能会问自己如何做到这一点,这很简单,如果第二帧尚未创建,则在操作监听器中创建实例,否则更新它。

private ActionListener listener = e -> {
    if (e.getSource().equals(submitButton)) {
        if (!frame.isVisible()) {
            circle = new MyCircle((Integer) box1.getSelectedItem(), (Integer) box2.getSelectedItem());
            frame.add(circle);
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        } else {
            circle.updateAngles((Integer) box1.getSelectedItem(), (Integer) box2.getSelectedItem());
        }
    }
};

注意:

如果关闭第二个窗口,所有先前的数据都将丢失,如果您想保存该状态,请使用 frame 可见性并初始化 MyCircle 实例下面代码中的 createAndShowGui() 方法。

<小时/>

下一步是您需要跟踪您添加的所有角度,因为您可能需要一个 List 并对其进行迭代,或者将其绘制到 BufferedImage,然后将该图像绘制在 JPanel 上。在本示例中,我们将使用 List 选项。

但是,对于此示例,如果数据太多,则可能无法显示,要纠正该问题,也可以使用 JScrollPane,但我将其留给您。

这个示例也使整个程序仅在您关闭主窗口时终止,但如果您关闭第二个窗口则不会终止。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class RadiusDrawer {
    private JFrame frame;
    private JFrame mainFrame;
    private int centerX = 50;
    private int centerY = 50;
    private int x1 = 0;
    private int y1 = 0;
    private int x2 = 0;
    private int y2 = 0;
    private int r = 100;

    private JComboBox<Integer> box1;
    private JComboBox<Integer> box2;
    private JLabel label1;
    private JLabel label2;
    private JButton submitButton;

    MyCircle circle;

    private static final Integer[] ANGLES = new Integer[]{15, 30, 45, 60, 75, 90};

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new RadiusDrawer()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());
        mainFrame = new JFrame("Main Frame");

        mainFrame.add(createMainWindow());
        mainFrame.pack();
        mainFrame.setVisible(true);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private ActionListener listener = e -> {
        if (e.getSource().equals(submitButton)) {
            if (!frame.isVisible()) {
                circle = new MyCircle((Integer) box1.getSelectedItem(), (Integer) box2.getSelectedItem());
                frame.add(circle);
                frame.pack();
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            } else {
                circle.updateAngles((Integer) box1.getSelectedItem(), (Integer) box2.getSelectedItem());
            }
        }
    };

    private JPanel createMainWindow() {
        JPanel pane = new JPanel();

        box1 = new JComboBox<>(ANGLES);
        box2 = new JComboBox<>(ANGLES);

        label1 = new JLabel("Angle 1");
        label2 = new JLabel("Angle 2");

        submitButton = new JButton("Submit");

        submitButton.addActionListener(listener);

        pane.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(20, 30, 20, 30);
        pane.add(box1, gbc);

        gbc.gridx = 1;
        pane.add(box2, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        pane.add(label1, gbc);

        gbc.gridx = 1;
        pane.add(label2, gbc);

        gbc.gridy = 2;
        pane.add(submitButton, gbc);

        return pane;
    }

    @SuppressWarnings("serial")
    class MyCircle extends JPanel {
        int cx = 0;
        int cy = 0;
        double lineX = 0;
        double lineY = 0;
        double roundedX = 0;
        double roundedY = 0;
        int angle1 = 0;
        int angle2 = 0;

        int angle1HistoryX = 15;
        int angle2HistoryX = 150;
        int angleHistoryY = 300;
        int angleHistoryYGap = 20;

        Color angle1Color = Color.BLUE;
        Color angle2Color = Color.RED;

        List <Integer> angle1History;
        List <Integer> angle2History;

        public MyCircle(int angle1, int angle2) {
            this.angle1 = angle1;
            this.angle2 = angle2;

            angle1History = new ArrayList<>();
            angle2History = new ArrayList<>();

            angle1History.add(angle1);
            angle2History.add(angle2);

            calculateCoords();
            calculateCenter();
        }

        private void updateAngles(int angle1, int angle2) {
            this.angle1 = angle1;
            this.angle2 = angle2;

            angle1History.add(angle1);
            angle2History.add(angle2);
            calculateCoords();

            this.revalidate();
            this.repaint();
        }

        private void calculateCoords() {
            x1 = (int) (r * Math.cos(Math.toRadians(angle1)));
            y1 = (int) (r * Math.sin(Math.toRadians(angle1))) * -1;

            x2 = (int) (r * Math.cos(Math.toRadians(angle2)));
            y2 = (int) (r * Math.sin(Math.toRadians(angle2))) * -1;
        }

        private void calculateCenter() {
            cx = centerX + r;
            cy = centerY + r;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;

            drawCircle(g2d, centerX, centerY, r);
            drawRadius(g2d);
            drawHistory(g2d);
        }

        private void drawCircle(Graphics2D g2d, int x, int y, int r) {
            g2d.setColor(Color.BLACK);
            g2d.draw(new Ellipse2D.Double(x, y, r * 2, r * 2));
        }

        private void drawRadius(Graphics2D g2d) {
            g2d.setColor(angle1Color);
            g2d.draw(new Line2D.Double(cx, cy, cx + x1, cy + y1));

            g2d.setColor(angle2Color);
            g2d.draw(new Line2D.Double(cx, cy, cx + x2, cy + y2));
        }

        private void drawHistory(Graphics2D g2d) {
            g2d.setColor(angle1Color);
            g2d.drawString("Angle1", angle1HistoryX, angleHistoryY);
            for (int i = 0; i < angle1History.size(); i++) {
                g2d.drawString(angle1History.get(i).toString(), angle1HistoryX, angleHistoryY + (angleHistoryYGap * (i + 1)));
            }

            g2d.setColor(angle2Color);
            g2d.drawString("Angle2", angle2HistoryX, angleHistoryY);
            for (int i = 0; i < angle2History.size(); i++) {
                g2d.drawString(angle2History.get(i).toString(), angle2HistoryX, angleHistoryY + (angleHistoryYGap * (i + 1)));
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 600);
        }
    }
}

就是这样!

enter image description here enter image description here

关于java - 如何多次在第二个窗口而不是另一个打开的窗口上获取结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48808084/

相关文章:

Java:将 HTML 或 PDF 嵌入到 JFrame 中

java - 移动一个矩形非常不稳定

java - 将 slider 组件的多个实例添加到 Jpanel

java - 在适配器模式后面隐藏第三方类的 java.util.date 吗? (包装)

java - 在抽象类上使用带有 toBuilder 的 Lombok @SuperBuilder 注释?

JavaFX : Why doesn't the setContent method of SwingNode with a JComponent parameter accept a JPanel?

java - 多部分表单不起作用

java - 如何在关闭子级后启用父级 JFrame?

用于翻阅基于 JPane 的 View 的 Java Swing 架构

java - 为什么我的 JButton 总是在 GUI 上弹出?