【问题标题】:How to use GUI in java? [closed]如何在java中使用GUI? [关闭]
【发布时间】:2023-04-06 05:18:02
【问题描述】:

我目前正在学习有关 Swing 和数据库的所有知识。我只是想尝试一些代码,所以我创建了一个程序,要求用户输入他/她的名字、姓氏、性别、生日和年龄。然后,输入将存储到数据库中。现在,我想用代码做三件事,但我不知道该怎么做。

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

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

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

这是我的代码:

第 1 部分:

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);
}
}

第 2 部分:

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;
}
}

第 3 部分:

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());
    }
}


}

第 4 部分:

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();
}
}

我为我的凌乱代码道歉,也没有解释我的解释,到目前为止,我倾向于忘记编程术语,但希望我会改进。

【问题讨论】:

    标签: java database swing user-interface


    【解决方案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,如果想添加你可以打开JDialog,用户可以在其中输入数据,然后在保存时关闭JDialog 并更新表格。

    【讨论】:

      【解决方案2】:

      例如,如果我选择 2 月,则日期最多只能是 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 将处理正确的语法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多