如何将变量从Gui表单类保存到另一个类

时间:2018-04-28 16:16:05

标签: java swing

我正在开发一个有gui的程序。用户输入动作侦听器保存在变量中的数字,然后将此变量发送到类main,并将其存储在另一个变量中。问题是,我目前正在这样做的方式是没有正确保存值(有时候vaue会保存,有时候它没有。我希望当用户在gui中输入值然后按下按钮时此值为保存在主类的变量中。我是java的新手,请原谅我糟糕的编码。 这是我的主要课程。

    public class Main {
public static boolean Click=false;
public static void main(String[] args) {
    int n=0, i;
    JFrame Frame = new JFrame();
    Input1 I1 = new Input1();
    Frame.setSize(600, 600);
    Frame.setLocationRelativeTo(null);
    Frame.setContentPane(I1.Input1Panel);
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.pack();
    Frame.setVisible(true);
    while (Click==false) {
        n = I1.Setn();
        System.out.println(""+n);
    }

这是我的gui课程。

    public class Input1 {
private JButton doneButton;
private JTextField textField1;
private JLabel Title;
private JLabel EnterNum;
public JPanel Input1Panel;

public int n;

Main M = new Main();

public Input1() {
    doneButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            n = Integer.parseInt(textField1.getText());
            while (M.Click==false) {
                if (n==0) {
                    n = Integer.parseInt(textField1.getText());
                }
                else {
                    M.Click=true;
                }
            }
        }
    });
}
public int Setn() {
    return n;
}

}

新代码 主类

    public class Main {
public static void main(String[] args) {
    int n=0, i;
    JFrame Frame = new JFrame();
    Input1 I1 = new Input1();
    Frame.setSize(600, 600);
    Frame.setLocationRelativeTo(null);
    Frame.setContentPane(I1.Input1Panel);
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.pack();
    Frame.setVisible(true);
    while (n==0) {
        n = I1.Setn();
        //System.out.println(""+n);
    }
    System.out.println("Main:"+n);

GUI类

    public class Input1 {
private JButton doneButton;
private JTextField textField1;
private JLabel Title;
private JLabel EnterNum;
public JPanel Input1Panel;

public int n;

Main M = new Main();

public Input1() {
    doneButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            n = Integer.parseInt(textField1.getText());
            System.out.println("Action Listener:"+n);
        }
    });
}
public int Setn() {
    return n;
}

}

2 个答案:

答案 0 :(得分:0)

看起来你有点过于复杂。另外,请阅读评论@pvg。你不能完全解释这个问题。除了你的代码的方式,我无法理解你究竟想要做什么。

如果您想从文本字段获取输入并执行以下操作:

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        // Swing applications must run on EDT thread. Use this method to achieve that.
        EventQueue.invokeLater(() -> {
            try {
                Test window = new Test();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * Create the application.
     */
    public Test() {
        frame = new JFrame();
        frame.setPreferredSize(new Dimension(300, 300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout());
        addComponents();
        frame.pack();
    }

    private void addComponents() {
        JTextField txtInput = new JTextField("Input: ");
        txtInput.setEditable(false);
        frame.getContentPane().add(txtInput);
        JTextField inputField = new JTextField();
        inputField.setColumns(10);
        frame.getContentPane().add(inputField);
        JButton getInputBtn = new JButton("Click me to give the input");
        getInputBtn.addActionListener(e -> {
            String input = inputField.getText(); 
            System.out.println("The input is: " + input); //Do something with the input.
        });
        frame.getContentPane().add(getInputBtn);
    }

}

我看到你从输入中解析了一个Integer。这个,你处理它的方式,可以给你一个NumberFormatException。我建议你阅读How to use formatted text field以避免这种情况。

P.S:添加"摇摆"标记到你的帖子。

答案 1 :(得分:0)

经过进一步的研究,我能够找到一个解决方案,我需要做的就是在声明时将“挥发性”与n放在一起。为了澄清,请访问该网站。 Loop doesn't see changed value without a print statement。 我的代码目前。

    volatile public static int n=0;
public static void main(String[] args) {

    int i=0;

    JFrame Frame = new JFrame();
    Input1 I1 = new Input1();
    Input2 I2 = new Input2();

    Frame.setSize(600, 600);
    Frame.setLocationRelativeTo(null);
    Frame.setContentPane(I1.Input1Panel);
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.pack();
    Frame.setVisible(true);
    while (n==0) {
        n = I1.Setn();
    }