从另一个 Class Java/BlueJ 更改 JTextField
Change JTextField from another Class Java/BlueJ
我正在使用 JFrame 开发一个项目(第一次)。我在框架上有一些 JTextFields 和 1 个 JButton。所以我想做的是从另一个 class 编辑我的 JTextField 的文本。我在 JTextField 中输入 2 个值,我希望结果显示在另一个 JTextField 中。
每当我按下按钮时,我希望将一个 JTextField textfield9 更改为我在另一个 class 方法(在本例中为模块中的 totalHours() 方法)中计算的值。
我已经尝试了很多我发现的示例,但其中 none 似乎对我有用 T_T。
这是我遇到问题的代码。
图形界面 Class:
private JButton button1;
private JTextField textfield5; // First value
private JTextField textfield7; // Second value
public JTextField textfield9; // Outcome - I made it public because I would get an error of 'cannot find symbol setText()' in the Module Class (totalHours() method)
// So when I click on the Button I want the textfield9 to show the method (totalHours()) from the Module class
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
Module module = new Module();
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
});
模块Class:
这是我希望在单击框架上的按钮时在 textfield9 中显示的结果
public int totalHours()
{
int num1 = Integer.parseInt(getHoursWeek()); // getter from GUI Class - textfield5
int num2 = Integer.parseInt(getTotalWeeksCourse()); // getter from GUI Class - textfield7
int num3 = num1 * num2;
gui.textfield9.setText(Integer.toString(num3));
return num3;
}
我不知道为什么,但 textfield9 中没有显示任何内容,而是打开了另一个 JFrame,但有 2 个异常:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
at Module.totalHours(Module.java:49)
at GUI.actionPerformed(GUI.java:67)
就是这两行:
int num1 = Integer.parseInt(getHoursWeek()); // Module Class totalHours() method
int text = module.totalHours(); // GUI Class button1 actionlistener
这是两个 Classes 的完整代码。删除不需要的行。
图形界面 Class:
public class GUI extends JFrame
{
private JMenuBar menuBar;
private JButton button1;
private JLabel label5;
private JLabel label7;
private JLabel label9;
private JTextField textfield5;
private JTextField textfield7;
public JTextField textfield9;
//Constructor
public GUI()
{
setTitle("GUI");
setSize(468,400);
//pane with null layout
JPanel contentPane = new JPanel(null);
contentPane.setPreferredSize(new Dimension(468,400));
contentPane.setBackground(new Color(192,192,192));
button1 = new JButton();
button1.setBounds(181,332,127,44);
button1.setText("Invoer");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
Module module = new Module();
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
});
label5 = new JLabel();
label5.setBounds(5,115,94,31);
label5.setText("Module Nummer");
label7 = new JLabel();
label7.setBounds(274,14,156,33);
label7.setText("Per module");
label9 = new JLabel();
label9.setBounds(276,57,90,35);
label9.setText("Totaal uren");
textfield5 = new JTextField();
textfield5.setBounds(120,225,90,35);
textfield7 = new JTextField();
textfield7.setBounds(120,280,90,35);
textfield9 = new JTextField();
textfield9.setBounds(361,57,90,35);
//adding components to contentPane panel
contentPane.add(button1);
contentPane.add(label5);
contentPane.add(label7);
contentPane.add(label8);
contentPane.add(label9);
contentPane.add(textfield5);
contentPane.add(textfield7);
contentPane.add(textfield9);
//adding panel to JFrame and seting of window position and close operation
getContentPane().add(contentPane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
pack();
setVisible(true);
//initGUI();
}
public static void main(String[] args)
{
System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run()
{
new GUI();
}
});
}
public String getTextfield1()
{
String txtfield1 = textfield1.getText();
return txtfield1;
}
public String getTextfield2()
{
String txtfield2 = textfield2.getText();
return txtfield2;
}
public String getTextfield3()
{
String txtfield3 = textfield3.getText();
return txtfield3;
}
public String getTextfield4()
{
String txtfield4 = textfield4.getText();
return txtfield4;
}
public String getTextfield5()
{
String txtfield5 = textfield5.getText();
return txtfield5;
}
public String getTextfield7()
{
String txtfield7 = textfield7.getText();
return txtfield7;
}
public String getTextfield9()
{
String txtfield9 = textfield9.getText();
return txtfield9;
}
}
模块Class:
public class Module
{
private GUI gui;
/**
* Constructor for objects of class Module
*/
public Module()
{
gui = new GUI();
}
public String getCourseName()
{
return gui.getTextfield1();
}
public String getSchoolDays()
{
return gui.getTextfield2();
}
public String getModuleNumber()
{
return gui.getTextfield3();
}
public String getWeekNumber()
{
return gui.getTextfield4();
}
public String getHoursWeek()
{
return gui.getTextfield5();
}
public String getTotalWeeksCourse()
{
return gui.getTextfield7();
}
public int totalHours()
{
int num1 = Integer.parseInt(getHoursWeek());
int num2 = Integer.parseInt(getTotalWeeksCourse());
int num3 = num1 * num2;
gui.textfield9.setText(Integer.toString(num3));
return num3;
}
}
抱歉,如果很难理解我想说的话,我从来没有很好地解释过事情。谁能帮我解决这个问题!?
您的代码的问题在于,您每次单击按钮时都会在 ActionListener 内部 class 中创建一个新的 Module 对象,这又会创建一个新的 GUI 对象等等...您还有一个讨厌的潜在循环 - 如果您将模块移出 ActionListener,它将创建一个新的 GUI,这将创建一个新的模块,创建一个新的 GUI 等等...
有几个问题 - 我会一一解决:
循环引用
不要为每个模块创建一个新的 GUI,也不要为每个 GUI 创建一个新的模块。相反 - 在模块中有一个用于引用 GUI 的字段和一个 setGUI() 方法:
public class Module
{
private GUI gui;
public void setGUI(GUI myGUI)
{
this.gui = myGUI;
}
... // rest of Module class
从 GUI 构造函数中调用它,即
module.setGUI(this);
在 ActionListener 中创建模块对象
那么问题出在这段代码上:
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
Module module = new Module();
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
});
特别是这一行:
Module module = new Module();
您需要从 GUI 对象引用的 Module 对象的单个实例。然后,您每次都从同一对象读取 totalHours。有几个不同的选项可以让你如何做到这一点 - 我会推荐一个:
- 将模块作为 GUI 中的一个字段 class
- 使 GUI class 实现 ActionListener
将您的 actionPerformed 方法添加到 GUI class:
public void actionPerformed(ActionEvent evt)
{
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
用 button1.addActionListener(this);
替换当前用于添加动作侦听器的代码
从 totalHours() 方法接收不到任何信息时出现异常
你看
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
如果您查看堆栈跟踪 - 您会发现类似以下内容:
at Module.totalHours(Module.java:49)
当您查看 totalHours() 方法时,它正在读取 GUI 文本字段并尝试将它们解析为整数。它们是空的(除非你在其中输入了一些东西),所以 parseInt 试图从一个空字符串(“”)创建一个整数。您需要向该方法添加一些错误检查。
我正在使用 JFrame 开发一个项目(第一次)。我在框架上有一些 JTextFields 和 1 个 JButton。所以我想做的是从另一个 class 编辑我的 JTextField 的文本。我在 JTextField 中输入 2 个值,我希望结果显示在另一个 JTextField 中。
每当我按下按钮时,我希望将一个 JTextField textfield9 更改为我在另一个 class 方法(在本例中为模块中的 totalHours() 方法)中计算的值。
我已经尝试了很多我发现的示例,但其中 none 似乎对我有用 T_T。
这是我遇到问题的代码。
图形界面 Class:
private JButton button1;
private JTextField textfield5; // First value
private JTextField textfield7; // Second value
public JTextField textfield9; // Outcome - I made it public because I would get an error of 'cannot find symbol setText()' in the Module Class (totalHours() method)
// So when I click on the Button I want the textfield9 to show the method (totalHours()) from the Module class
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
Module module = new Module();
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
});
模块Class:
这是我希望在单击框架上的按钮时在 textfield9 中显示的结果
public int totalHours()
{
int num1 = Integer.parseInt(getHoursWeek()); // getter from GUI Class - textfield5
int num2 = Integer.parseInt(getTotalWeeksCourse()); // getter from GUI Class - textfield7
int num3 = num1 * num2;
gui.textfield9.setText(Integer.toString(num3));
return num3;
}
我不知道为什么,但 textfield9 中没有显示任何内容,而是打开了另一个 JFrame,但有 2 个异常:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
at Module.totalHours(Module.java:49)
at GUI.actionPerformed(GUI.java:67)
就是这两行:
int num1 = Integer.parseInt(getHoursWeek()); // Module Class totalHours() method
int text = module.totalHours(); // GUI Class button1 actionlistener
这是两个 Classes 的完整代码。删除不需要的行。
图形界面 Class:
public class GUI extends JFrame
{
private JMenuBar menuBar;
private JButton button1;
private JLabel label5;
private JLabel label7;
private JLabel label9;
private JTextField textfield5;
private JTextField textfield7;
public JTextField textfield9;
//Constructor
public GUI()
{
setTitle("GUI");
setSize(468,400);
//pane with null layout
JPanel contentPane = new JPanel(null);
contentPane.setPreferredSize(new Dimension(468,400));
contentPane.setBackground(new Color(192,192,192));
button1 = new JButton();
button1.setBounds(181,332,127,44);
button1.setText("Invoer");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
Module module = new Module();
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
});
label5 = new JLabel();
label5.setBounds(5,115,94,31);
label5.setText("Module Nummer");
label7 = new JLabel();
label7.setBounds(274,14,156,33);
label7.setText("Per module");
label9 = new JLabel();
label9.setBounds(276,57,90,35);
label9.setText("Totaal uren");
textfield5 = new JTextField();
textfield5.setBounds(120,225,90,35);
textfield7 = new JTextField();
textfield7.setBounds(120,280,90,35);
textfield9 = new JTextField();
textfield9.setBounds(361,57,90,35);
//adding components to contentPane panel
contentPane.add(button1);
contentPane.add(label5);
contentPane.add(label7);
contentPane.add(label8);
contentPane.add(label9);
contentPane.add(textfield5);
contentPane.add(textfield7);
contentPane.add(textfield9);
//adding panel to JFrame and seting of window position and close operation
getContentPane().add(contentPane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
pack();
setVisible(true);
//initGUI();
}
public static void main(String[] args)
{
System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run()
{
new GUI();
}
});
}
public String getTextfield1()
{
String txtfield1 = textfield1.getText();
return txtfield1;
}
public String getTextfield2()
{
String txtfield2 = textfield2.getText();
return txtfield2;
}
public String getTextfield3()
{
String txtfield3 = textfield3.getText();
return txtfield3;
}
public String getTextfield4()
{
String txtfield4 = textfield4.getText();
return txtfield4;
}
public String getTextfield5()
{
String txtfield5 = textfield5.getText();
return txtfield5;
}
public String getTextfield7()
{
String txtfield7 = textfield7.getText();
return txtfield7;
}
public String getTextfield9()
{
String txtfield9 = textfield9.getText();
return txtfield9;
}
}
模块Class:
public class Module
{
private GUI gui;
/**
* Constructor for objects of class Module
*/
public Module()
{
gui = new GUI();
}
public String getCourseName()
{
return gui.getTextfield1();
}
public String getSchoolDays()
{
return gui.getTextfield2();
}
public String getModuleNumber()
{
return gui.getTextfield3();
}
public String getWeekNumber()
{
return gui.getTextfield4();
}
public String getHoursWeek()
{
return gui.getTextfield5();
}
public String getTotalWeeksCourse()
{
return gui.getTextfield7();
}
public int totalHours()
{
int num1 = Integer.parseInt(getHoursWeek());
int num2 = Integer.parseInt(getTotalWeeksCourse());
int num3 = num1 * num2;
gui.textfield9.setText(Integer.toString(num3));
return num3;
}
}
抱歉,如果很难理解我想说的话,我从来没有很好地解释过事情。谁能帮我解决这个问题!?
您的代码的问题在于,您每次单击按钮时都会在 ActionListener 内部 class 中创建一个新的 Module 对象,这又会创建一个新的 GUI 对象等等...您还有一个讨厌的潜在循环 - 如果您将模块移出 ActionListener,它将创建一个新的 GUI,这将创建一个新的模块,创建一个新的 GUI 等等...
有几个问题 - 我会一一解决:
循环引用
不要为每个模块创建一个新的 GUI,也不要为每个 GUI 创建一个新的模块。相反 - 在模块中有一个用于引用 GUI 的字段和一个 setGUI() 方法:
public class Module
{
private GUI gui;
public void setGUI(GUI myGUI)
{
this.gui = myGUI;
}
... // rest of Module class
从 GUI 构造函数中调用它,即
module.setGUI(this);
在 ActionListener 中创建模块对象
那么问题出在这段代码上:
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
Module module = new Module();
int text = module.totalHours();
String textt = Integer.valueOf(text).toString();
textfield9.setText(textt);
}
});
特别是这一行:
Module module = new Module();
您需要从 GUI 对象引用的 Module 对象的单个实例。然后,您每次都从同一对象读取 totalHours。有几个不同的选项可以让你如何做到这一点 - 我会推荐一个:
- 将模块作为 GUI 中的一个字段 class
- 使 GUI class 实现 ActionListener
将您的 actionPerformed 方法添加到 GUI class:
public void actionPerformed(ActionEvent evt) { int text = module.totalHours(); String textt = Integer.valueOf(text).toString(); textfield9.setText(textt); }
用
button1.addActionListener(this);
替换当前用于添加动作侦听器的代码
从 totalHours() 方法接收不到任何信息时出现异常
你看
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
如果您查看堆栈跟踪 - 您会发现类似以下内容:
at Module.totalHours(Module.java:49)
当您查看 totalHours() 方法时,它正在读取 GUI 文本字段并尝试将它们解析为整数。它们是空的(除非你在其中输入了一些东西),所以 parseInt 试图从一个空字符串(“”)创建一个整数。您需要向该方法添加一些错误检查。