我有两个班,一个是摇摆和主班,一个是动作执行方法
//class swing
package system;
import javax.swing.*;
import java.awt.event.*;
public class GUI{
JFrame frame = new JFRame("frame");
JTextField tx = new JTextField(10);
JButton bt = new JButton("button");
public void getTx(){
return tx.getText();
}
public void init(){
frame.setSize(200, 200);
frame.add(tx);
frame.add(bt);
tx.setBounds(20, 20, 140, 50);
bt.setBounds(20, 100, 120, 40);
btaddcom.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
control.btclicked(e);
}
});
}
public GUI(){
init();
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable(){
public void run() {
new GUI().frame.setVisible(true);
}
});
}
}
下面是我的另一个班级
package system;
import java.awt;
import java.awt.event.*;
public abstract control implements ActionListener{
public static void btclicked(ActionEvent e){
GUI gui = new GUI();
String txf = gui.getTx();
JOptionPane.showMessageDialog(null, txf);
}
}
我的问题是为什么我无法从JTextField获取值tx,因为每当我填充文本时它总是空白的。 感谢
答案 0 :(得分:4)
您正在创建GUI类的新实例,因此所有字段都将为空/重置。
这是你应该做的:
public abstract control implements ActionListener{
public static void btclicked(ActionEvent e, GUI gui){
String txf = gui.getTx();
JOptionPane.showMessageDialog(null, txf);
}
}
用法:
btaddcom.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
control.btclicked(e, GUI.this);
}
});
答案 1 :(得分:3)
您正在创建新实例GUI
。这与屏幕上显示的内容无关,因此您尝试对其进行的任何更新都不会反映在屏幕上...
相反,您应该传递某种模型(首选)或对GUI
或JTextField
的引用。
更像是......
public abstract control implements ActionListener{
public static void btclicked(ActionEvent e, GUI gui){
String txf = gui.getTx();
JOptionPane.showMessageDialog(null, txf);
}
}
例如。
就个人而言,我更喜欢提供某种类型的模型,因为它会阻止向调用者公开其他内容,因为您的btclicked
方法现在可以完全控制您的GUI
课程,您可能不会想
答案 2 :(得分:0)
如果我正确地阅读了这些评论,似乎就解决了这个问题。但为了以防万一,还有一个基本的语法错误。你的getTx()方法返回一个字符串但你把它列为void。我确定这是马上被抓住了但是我认为为了以防万一而指出它并没有什么坏处。干杯。
public String getTx(){
return tx.getText();
}