我目前正在学习所有关于摇摆和数据库的知识。我只想尝试一些代码,所以我创建了一个程序,要求用户输入他/她的名字,姓氏,性别,生日和年龄。然后,输入将存储到数据库中。现在,我想用代码做三件事,但我无法弄清楚如何去做。
我已经制作了三个月份,日期和年份的组合框。我希望日期的组合框根据我要选择的月份进行调整。例如,如果我选择二月,则日期应该最多为28。
接下来,当我点击添加项目时,您可以输入所有信息。一切都工作正常,但我注意到当你点击按钮退出时,它只会关闭所有内容。我希望退出按钮仅关闭添加项目部分,同时整个菜单仍然可见。
最后,当我点击查看项目时,它会单独显示该表格。我希望表格在菜单中,就像添加项目一样。
这是我的代码:
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();
}
}
我为我的凌乱代码道歉,并且还有我的解释,截至目前我倾向于忘记编程方面的术语,但希望我会改进。
答案 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将采用正确的语法。