我正在开发一个有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;
}
}
答案 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();
}