问题描述
我一直在执行一个程序,以使用JTextField
将两个数字相加。
我已经能够使其运行,但是我想更改代码,以便将JTextField
中的值发送到方法文件(位于同一文件夹中)中,以将它们添加在一起。添加值后,我希望将答案发送回第三个JTextField
以显示答案。我已经进行了设置,以便在按下JButton
时会调用该方法,但是我不知道如何编写该方法并在第三个JTextField
中得到答案。
import javax.swing.*;
import java.awt.event.*;
public class A implements ActionListener {
JTextField tf1,tf2,tf3;
JButton b1;
A() {
JFrame f = new JFrame();
JLabel myLabel = new JLabel("Enter First Value");
myLabel.setBounds(50,50,150,20);
tf1 = new JTextField();
tf1.setBounds(50,75,250,20);
JLabel mysecondLabel = new JLabel("Enter Second Value");
mysecondLabel.setBounds(50,125,20);
tf2 = new JTextField();
tf2.setBounds(50,20);
tf3 = new JTextField();
tf3.setBounds(160,225,140,20);
tf3.setEditable(false);
b1 = new JButton("Sum");
b1.setBounds(50,95,20);
b1.addActionListener(this);
f.add(tf1);
f.add(myLabel);
f.add(tf2);
f.add(mysecondLabel);
f.add(tf3);
f.add(b1);
f.setSize(300,300);
f.setLayout(null);
f.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String s1 = tf1.getText();
String s2 = tf2.getText();
int x = Integer.parseInt(s1);
int y = Integer.parseInt(s2);
int z = 0;
if (e.getSource() == b1) {
B b = new B();
b.mymethod();
}
String result = String.valueOf(z);
tf3.setText(result);
}
public static void main(String[] args) {
new A();
}
}
import javax.swing.*;
import java.awt.event.*;
public class B {
public static void mymethod() {
int x,y;
int z = x + y;
}
}
解决方法
您可能想要执行以下操作:
try {
int a = Integer.valueOf(tf1.getText());
int b = Integer.valueOf(tf2.getText());
int sum = a + b;
tf3.setText(Integer.toString(sum));
} catch (NumberFormatException e) {
tf3.setText("Evaluation error: " + e.getMessage();
}
顺便说一句,您的辅助方法mymethod()
可能应该接受参数并返回一个值,而不是将其分配给另一个局部变量?
static int sum(int a,int b) {
return a + b;
}
,
您在其中定义了JButton
:b1.addActionListener(this);
-此行说:“在调用jbutton时,执行this
所引用的actionListener...。{{ 1}}“实现” this
,这意味着您的类有一个方法:ActionListener
,它接收一个actionPerformed
(实际上是告诉动作侦听器该事件的起源)。
因为您的类实现了ActionListener方法ActionEvent
,所以单击按钮时将调用该方法。
您的actionPerformed方法尝试通过调用actionPerformed()
来从B
获取值,这是行不通的。这是因为变量仅在类mymethod()
中是局部的。如果希望它们出现在类B
中,则需要声明类A
,例如:
B
然后针对您要编写的类public class B {
public static int x() {
return 5;
}
public static int y() {
return 15;
}
public static int mymethod(int x,int y) {
return x + y;
}
}
的动作执行方法:
A
如果您希望按钮仅添加文本字段中的内容,则只需删除将文本设置为public void actionPerformed(ActionEvent e) {
if(e.getSource()!=b1){
return;
}
String s1 = tf1.setText(B.x()); // X
String s2 = tf2.setText(B.y()); // Y
int x = Integer.parseInt(s1.getText());
int y = Integer.parseInt(s2.getText());
String result = B.mymethod(x,y);
tf3.setText(result); // set the value of tf3 to X + Y
}
和B.x()
的两行即可。
请注意,如果您在两个文本字段中输入有效整数以外的任何内容,将会发生异常。您可能要处理这些。整数也有一个最大值,因此简单地将两个整数相加将在B.y()
处最大,请参见:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#MAX_VALUE