首页 文章

Java GUI使用一个Jtextfield进行文本和数字输入

提问于
浏览
0

我有一个DAO类,其中包含一些方法,例如通过ID和数据库中的名称获取员工 . 方法正常 .

现在我决定使用IntelliJ IDEA的GUI Designer创建一个简单的表单 . 我希望能够在同一个JtextField中输入ID(int值)或名称(String值),并在单击“Submit”按钮后显示结果 . 是否可以或者我应该为每种类型的输入创建额外的JTextField和JButton对?

现在我可以使actionPerformed方法只对方法searchEmployees(按名称)和getAllEmployees正常工作(如果用户单击带有空JTextField的JButton,它只会生成“SELECT * FROM employees”) . 我是构建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);
}}

Edit: 我试图修改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);

            }

        }
    });

1 回答

  • 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的Document上设置和删除DocumentFilter来完成此操作 .

相关问题