如何在java中使用GUI?

时间:2015-10-08 12:54:12

标签: java database swing user-interface

我目前正在学习所有关于摇摆和数据库的知识。我只想尝试一些代码,所以我创建了一个程序,要求用户输入他/她的名字,姓氏,性别,生日和年龄。然后,输入将存储到数据库中。现在,我想用代码做三件事,但我无法弄清楚如何去做。

  1. 我已经制作了三个月份,日期和年份的组合框。我希望日期的组合框根据我要选择的月份进行调整。例如,如果我选择二月,则日期应该最多为28。

  2. 接下来,当我点击添加项目时,您可以输入所有信息。一切都工作正常,但我注意到当你点击按钮退出时,它只会关闭所有内容。我希望退出按钮仅关闭添加项目部分,同时整个菜单仍然可见。

  3. 最后,当我点击查看项目时,它会单独显示该表格。我希望表格在菜单中,就像添加项目一样。

  4. 这是我的代码:

    PART1:

    package PersonalInfo;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class TableFormatter extends JFrame{
    private final int WIDTH = 600;
    private final int HEIGHT = 400;
    public TableFormatter(Object[][]data,Object[]colNames){
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JTable table = new JTable(data,colNames);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane,BorderLayout.CENTER);
        setSize(WIDTH,HEIGHT);
        setVisible(true);
    }
    }
    

    PART2:

    package PersonalInfo;
    import java.sql.*;
    public class ConnectDBQuery {
    public final String DB_URL="jdbc:derby://localhost:1527/InformationDB;";
    private Connection conn;
    private String[][]tableData;
    private String[]colNames;
    public ConnectDBQuery(){
        getDatabaseConnection();
        try{
            Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                ResultSet.CONCUR_READ_ONLY);
            ResultSet resultSet = stmt.executeQuery("SELECT * FROM PersonalInfo");
            resultSet.last();
            int numRows = resultSet.getRow();
            resultSet.first();
    
            ResultSetMetaData meta = resultSet.getMetaData();
            colNames = new String[meta.getColumnCount()];
            for(int i = 0;i < meta.getColumnCount();i++){
                colNames[i]=meta.getColumnLabel(i+1);
            }
    
            tableData = new String[numRows][meta.getColumnCount()];
            for(int row = 0;row < numRows;row++){
                for(int col = 0;col < meta.getColumnCount();col++){
                    tableData[row][col]=resultSet.getString(col+1);
                }
                resultSet.next();
            }
            stmt.close();
            conn.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    
    private void getDatabaseConnection(){
        try{
            conn = DriverManager.getConnection(DB_URL);
        }catch(Exception ex){
            ex.printStackTrace();
            System.exit(0);
        }
    }
    
    public String[]getColumnNames(){
        return colNames;
    }
    
    public String[][]getTableData(){
        return tableData;
    }
    }
    

    PART3:

    package PersonalInfo;
    
    import java.sql.*;
    
    public class InfoDBQuery {
    public final String DB_URL="jdbc:derby://localhost:1527/InformationDB;";
    
    public InfoDBQuery(String firstName,String lastName,String gender,String month,String date,String year,String age){
    
        try{
            Connection conn = DriverManager.getConnection(DB_URL);
            Statement stmt = conn.createStatement();
            String sql = "INSERT INTO PersonalInfo VALUES ('" +
            firstName + "','" + lastName + "','" + gender + "','" + month + "-" + date + "-" + year + "','" + age + "')";
            stmt.executeUpdate(sql);
            stmt.close();
            conn.close();
        }catch(Exception ex){
            System.out.println("ERROR: " + ex.getMessage());
        }
    }
    
    
    }
    

    PART4:

    package PersonalInfo;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class InfoDBViewer extends JFrame{
    JMenuBar menuBar;
    JMenu fileMenu;
    JMenuItem addItem;
    JMenuItem viewItem;
    JMenuItem exitItem;
    
    JPanel textPanel;
    JLabel firstNameLabel;
    JLabel lastNameLabel;
    JTextField firstNameText;
    JTextField lastNameText;
    JLabel ageLabel;
    JTextField ageText;
    
    JPanel rbuttonPanel;
    JRadioButton maleButton;
    JRadioButton femaleButton;
    
    JPanel comboPanel;
    JComboBox monthBox;
    JComboBox dateBox;
    JComboBox yearBox;
    
    String[]months = {"January","February","March","April",
            "May","June","July","August","September","October",
            "November","December"};
    
    String[]date = {"1","2","3","4","5","6","7","8","9","10","11",
            "12","13","14","15","16","17","18","19","20","21","22","23","24","25",
            "26","27","28","29","30","31"};
    
    String[]year = {"1985","1986","1987","1988","1989","1990","1991","1992","1993",
            "1994","1995","1996","1997","1998","1999","2000","2001","2002","2003",
            "2004","2005","2006","2007","2008","2009","2010","2011","2012","2013",
            "2014","2015"};
    
    JPanel buttonPanel;
    JButton submitButton;
    JButton exitButton;
    
    public InfoDBViewer(){
        setTitle("Menu System");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600,400);
        buildMenuBar();
        setVisible(true);
    }
    
    private void AddItems(){
        setTitle("CoffeeDB Viewer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600,400);
        buildTextFieldPanel();
        buildRadioButtonPanel();
        buildComboBoxPanel();
        buildButtonPanel();
        add(textPanel,BorderLayout.NORTH);
        add(rbuttonPanel,BorderLayout.WEST);
        add(comboPanel,BorderLayout.EAST);
        add(buttonPanel,BorderLayout.SOUTH);
    
        setVisible(true);
    }
    
    private void buildMenuBar(){
        menuBar = new JMenuBar();
        buildFileMenu();
    
        menuBar.add(fileMenu);
        setJMenuBar(menuBar);
    }
    
    private void buildFileMenu(){
        exitItem = new JMenuItem("Exit");
        exitItem.addActionListener(new ExitListener());
        addItem = new JMenuItem("Add Item");
        addItem.addActionListener(new AddListener());
        viewItem = new JMenuItem("View Item");
        viewItem.addActionListener(new ViewListener());
    
        fileMenu = new JMenu("File");
        fileMenu.add(addItem);
        fileMenu.add(viewItem);
        fileMenu.add(exitItem);
    }
    
    private class AddListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            AddItems();
        }
    }
    
    private class ViewListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            ConnectDBQuery dbQuery = new ConnectDBQuery();
            String[]colNames = dbQuery.getColumnNames();
            String[][]data = dbQuery.getTableData();
            TableFormatter table = new TableFormatter(data,colNames);
        }
    }
    
    private class ExitListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            System.exit(0);
        }
    }
    
    
    
    private void buildTextFieldPanel(){
        textPanel = new JPanel();
        firstNameLabel = new JLabel("First Name");
        firstNameText = new JTextField(10);
        lastNameLabel = new JLabel("Last Name");
        lastNameText = new JTextField(10);
        ageLabel = new JLabel("Age");
        ageText = new JTextField(5);
    
        textPanel.add(firstNameLabel);
        textPanel.add(firstNameText);
        textPanel.add(lastNameLabel);
        textPanel.add(lastNameText);
        textPanel.add(ageLabel);
        textPanel.add(ageText);
    
    }
    
    private void buildRadioButtonPanel(){
        rbuttonPanel = new JPanel();
        maleButton = new JRadioButton("Male",true);
        femaleButton = new JRadioButton("Female");
    
        ButtonGroup bg = new ButtonGroup();
        bg.add(maleButton);
        bg.add(femaleButton);
    
        rbuttonPanel.add(maleButton);
        rbuttonPanel.add(femaleButton);
    }
    
    private void buildComboBoxPanel(){
        comboPanel = new JPanel();
        monthBox = new JComboBox(months);
        dateBox = new JComboBox(date);
        yearBox = new JComboBox(year);
    
        comboPanel.add(monthBox);
        comboPanel.add(dateBox);
        comboPanel.add(yearBox);
    }
    
    private void buildButtonPanel(){
        buttonPanel = new JPanel();
        submitButton = new JButton("Submit");
        submitButton.addActionListener(new SubmitButtonListener());
        exitButton = new JButton("Exit");
        exitButton.addActionListener(new ExitButtonListener());
        buttonPanel.add(submitButton);
        buttonPanel.add(exitButton);
    }
    
    private class SubmitButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            String firstNameStatement = firstNameText.getText();
            String lastNameStatement = lastNameText.getText();
    
            String genderStatement = "";
            if(maleButton.isSelected()){
                genderStatement = maleButton.getText();
            }else if(femaleButton.isSelected()){
                genderStatement = femaleButton.getText();
            }
    
            String monthStatement = (String)monthBox.getSelectedItem();
            String dateStatement = (String)dateBox.getSelectedItem();
            String yearStatement = (String)yearBox.getSelectedItem();
    
            String ageStatement = ageText.getText();
    
            InfoDBQuery dbQuery = new InfoDBQuery(firstNameStatement,
                    lastNameStatement,genderStatement,monthStatement,
                    dateStatement,yearStatement,ageStatement);
    
        }
    }
    
    private class ExitButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            System.exit(0);
        }
    }
    
    public static void main(String[]args){
        new InfoDBViewer();
    }
    }
    

    我为我的凌乱代码道歉,并且还有我的解释,截至目前我倾向于忘记编程方面的术语,但希望我会改进。

2 个答案:

答案 0 :(得分:1)

问题1)

您需要手动更改(或构建日期组合框)将监听器添加到月份组合框中

     monthBox.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            //Set you days
        }
    });

问题2)不能真正遵循你的代码而是 System.exit(),将关闭应用程序 setVisible(false)会隐藏,如果您想再次查看,则需要执行setVisible(true)

问题3)你想在菜单中显示表格,使用JMenu并添加到它JMenuItems(你的表的1列?)......

我建议您在JFrame上使用,然后使用JPanel将其添加到显示该表的JFrame,如果您愿意添加,可以打开{{1}用户可以输入数据,然后在保存时关闭JDialog并更新表。

答案 1 :(得分:0)

  

例如,如果我选择二月,则日期应该最多为28。

不要忘记闰年计算。您可能需要考虑日期组件,例如JXDateChooser或JCalendar。

  

但是我注意到当你点击按钮退出时,它只会关闭所有内容。

应用程序应该只有一个JFrame。其他子窗口应该是模态JDialog。关闭对话框时,只有对话框关闭,框架保持打开状态。

String sql = "INSERT INTO PersonalInfo VALUES ('" +  firstName + "','" + lastName + "','" + gender + "','" + month + "-" + date + "-" + year + "','" + age + "')";

不要像那样构建你的SQL,它试图匹配文字太容易出错。

相反,您可以使用PreparedStatement,这使SQL语句更容易编码和维护。

String sql = "INSERT INTO PersonalInfo VALUES (?, ?, ?, ?, ?)";

PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString( 1, firstName );
stmt.setString( 2, lastName );
stmt.setString( 3, gender );
stmt.setString( 4, month + "-" + date + "-" + year );
stmt.setInt( 5, age );

stmt.executeUpdate();

现在,PreparedStatement将采用正确的语法。