我有一个DAO类,其中包含一些方法,例如通过ID和数据库中的名称获取员工。方法运作正常。
现在我决定使用IntelliJ IDEA的GUI Designer创建一个简单的表单。我希望能够在同一个JtextField中输入ID(int值)或名称(String值),并在单击" Submit"之后显示结果。按钮。是否可以或者我应该为每种类型的输入创建额外的JTextField和JButton对吗?
现在我可以使actionPerformed方法仅对方法searchEmployees(按名称)和getAllEmployees正常工作(它只是使" SELECT * FROM employees"如果用户点击带有空JTextField的JButton)。 我是构建GUI应用程序的新手,因此欢迎所有改进代码的建议。
这是我的代码
public class EmployeeApp extends JFrame {
private JPanel panelMain;
private JButton searchButton;
private JScrollPane scrollPane;
private JTextField idTextField;
private JLabel lastNameLabel;
private EmployeesDao employeesDao;
public EmployeeApp() {
// create the DAO
try {
employeesDao = new EmployeesDao();
} catch (Exception exc) {
JOptionPane.showMessageDialog(this, "Error: " + exc, "Error", JOptionPane.ERROR_MESSAGE);
}
searchButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String searchValue = idTextField.getText();
List<Employee> employees;
if (searchValue != null && searchValue.trim().length() > 0) {
employees = employeesDao.searchEmployees(searchValue);
} else {
employees = employeesDao.getAllEmployees();
}
for (Employee temp : employees) {
System.out.println(temp);
}
} catch (Exception exc) {
JOptionPane.showMessageDialog(EmployeeApp.this, "Error: " + exc, "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame("EmployeeApp");
frame.setContentPane(new EmployeeApp().panelMain);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}}
修改 我试图修改try / catch块,现在当我在JTextField中输入一个数字时,getEmployeeById方法正常工作。但是在输入字符串时我得到了NumberFormatException。
searchButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String searchValue = idTextField.getText();
List<Employee> employees;
Employee employee;
try {
int numValue = Integer.parseInt(searchValue);
employee = employeesDao.getEmployeeById(numValue);
System.out.println(employee);
if (searchValue != null && searchValue.trim().length() > 0) {
employees = employeesDao.searchEmployees(searchValue);
}
else {
employees = employeesDao.getAllEmployees();
}
for (Employee temp : employees) {
System.out.println(temp);
}
} catch (Exception exc) {
JOptionPane.showMessageDialog(EmployeeApp.this, "Error: " + exc, "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
答案 0 :(得分:0)
我们建议您从catch块中获取错误消息,而是在那里做一些更有用的事情。如果输入了catch块,那么您知道idTextField不包含有效的数字数据,您应该使用该文本使用名称或文本数据而不是数字数据来提取数据。类似的东西:
@Override
public void actionPerformed(ActionEvent e) {
String idText = idTextField.getText().trim();
try {
int value = Integer.parseInt(idText);
// if we have reached this line, then idText is numeric
// code here to get Employee by value number
} catch (NumberFormatException e1) {
// don't show an error message here!
// If we get here we know that idText is **not** numeric
// code here to to get Employee by name using idText
}
}
但是我自己,我不喜欢这种kludgery,而是试图让我的代码更加白痴。您可以使用JRadioButtons允许用户使用文本或数字进行数据提取,然后装配JTextField,以便在用户选择数字选项时不会接受文本。例如,可以通过在JTextField文档上设置和删除DocumentFilter来完成此操作。