我正在尝试在与GUI不同的类中运行JButton ActionListener。所以我让按钮工作,但我不能“访问”TextFields,当我想访问它们时它们只是“空”。
这就是我的GUI类:
public class CaeserGUI extends JFrame {
JPanel contentPane;
private JTextField txt_input;
private JTextField number_input;
private JButton btn_translate;
private JTextArea txt_output;
private JTextField txt_input2;
private JTextField number_input2;
private JTextArea txt_output2;
/**
* Launch the application.
* Author: Paul Viehmann
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CaeserGUI frame = new CaeserGUI();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public CaeserGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
txt_input = new JTextField();
txt_input.setBounds(10, 38, 363, 20);
contentPane.add(txt_input);
txt_input.setColumns(10);
number_input = new JTextField();
number_input.setBounds(383, 38, 41, 20);
contentPane.add(number_input);
number_input.setColumns(10);
JTextPane txtpnZubersetzenderSatz = new JTextPane();
txtpnZubersetzenderSatz.setText("Zu \u00FCbersetzender Satz:");
txtpnZubersetzenderSatz.setBounds(10, 11, 126, 20);
contentPane.add(txtpnZubersetzenderSatz);
JTextPane txtpnVerschiebung = new JTextPane();
txtpnVerschiebung.setText("Verschiebung:");
txtpnVerschiebung.setBounds(349, 11, 75, 20);
contentPane.add(txtpnVerschiebung);
txt_output = new JTextArea();
txt_output.setBounds(10, 69, 414, 40);
contentPane.add(txt_output);
JTextPane txtpnZuDechiffrierenderSatz = new JTextPane();
txtpnZuDechiffrierenderSatz.setText("Zu dechiffrierender Satz:");
txtpnZuDechiffrierenderSatz.setBounds(10, 120, 126, 20);
contentPane.add(txtpnZuDechiffrierenderSatz);
txt_input2 = new JTextField();
txt_input2.setColumns(10);
txt_input2.setBounds(10, 147, 363, 20);
contentPane.add(txt_input2);
number_input2 = new JTextField();
number_input2.setColumns(10);
number_input2.setBounds(383, 147, 41, 20);
contentPane.add(number_input2);
JTextPane textPane_1 = new JTextPane();
textPane_1.setText("Verschiebung:");
textPane_1.setBounds(349, 120, 75, 20);
contentPane.add(textPane_1);
txt_output2 = new JTextArea();
txt_output2.setBounds(10, 176, 414, 40);
contentPane.add(txt_output2);
ActionListener actionListener = new ButtonListener(number_input, number_input2, btn_translate, txt_output, txt_input, txt_input2, txt_output2);
btn_translate = new JButton("\u00DCbersetzen");
btn_translate.addActionListener(actionListener);
btn_translate.setBounds(10, 227, 414, 23);
contentPane.add(btn_translate);
}
}
这是我的听众课程:
public class ButtonListener implements ActionListener{
private JTextField txt_input;
private JTextField number_input;
private JButton btn_translate;
private JTextArea txt_output;
private JTextField txt_input2;
private JTextField number_input2;
private JTextArea txt_output2;
public ButtonListener(JTextField txt_input, JTextField number_input,
JButton btn_translate, JTextArea txt_output,
JTextField txt_input2, JTextField number_input2,
JTextArea txt_output2){
this.txt_input = txt_input;
this.number_input = number_input;
this.btn_translate = btn_translate;
this.txt_output = txt_output;
this.txt_input2 = txt_input2;
this.number_input2 = number_input2;
this.txt_output2 = txt_output2;
}
public void actionPerformed(ActionEvent e){
if(txt_input.getText().equals("")){
System.exit(0);
}else{
}
}
}
当我按下按钮时,即使我在textField中写了一些东西,我的程序也会退出。
我阅读了很多其他帖子,但无法让它发挥作用。
我很感激每一个答案。
答案 0 :(得分:1)
您似乎以不正确的顺序传递参数(据我所知,根据您的命名约定)
+---------------------------+--------------------------+
| ActionListener Parameters | The Order You're Passing |
+---------------------------+--------------------------+
| txt_input | number_input |
| number_input | number_input2 |
| btn_translate | btn_translate |
| txt_output | txt_output |
| txt_input2 | txt_input |
| number_input2 | txt_input2 |
| txt_output2 | txt_output2 |
+---------------------------+--------------------------+
这意味着,当您检查txt_input
中ActionListener
的值时,您实际上正在查看number_input
值......这会让我发出尖叫声
我的“一般”建议是创建一个interface
来提供getter和setter,其名称比“text”和“text2”更好,这样你就可以更好地区分它们的含义。我有CaeserGUI
实现此interface
,然后将其传递给ActionListener
,interface
只引用了null
的实例
避免使用JLabel
布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正
如果您认为我过度反应,那么当我在PC上运行您的代码时会发生这种情况
看看第二个字段中的“插入符号”是如何被破坏的?
我建议使用JTextPane
来提示字段而不是设置文本,因为这只是令人困惑。有关详细信息,请参阅How to Use Labels
像JScrollPane
这样的组件真正受益于<ul class="collection with-header"></ul>
,这将允许用户在文本扩展到组件的可视边界之外时查看文本。有关详细信息,请参阅How to Use Scroll Panes