我正在编写一个java swing应用程序,它从文本字段中收集数据并将其存储在数据库中。我有一个JmenuItem,我想用它来显示数据库中的数据。我有一个类从数据库收集数据并在jtable中插入数据。该类扩展了jframe。现在我遇到的问题是从jmenuitem执行该类。当我单击jmenuitem时,它会显示一个没有该表的空jframe。
这是带有jtable的类的代码。该课程是Reports2
public class Reports2 extends JFrame {
Connection con = null;
Statement st;
ResultSet rs;
public static void main(String[]args) throws Exception {
try {
Connection con= null ;
Statement st;
ResultSet rs;
String url = "jdbc:mysql://localhost:3306/first";
String user = "root";
String password = "Admin123";
try{
con = DriverManager.getConnection(url,user,password);
st = con.createStatement();
String qry = "SELECT * FROM request";
rs = st.executeQuery(qry);
JTable table = new JTable(buildTableModel(rs));
JFrame frame = new JFrame("Reports");
frame.setSize(800, 700);
frame.add(table);
frame.setVisible(true);
} catch (SQLException ex) {
Logger.getLogger(Reports2.class.getName()).log(Level.SEVERE, null, ex);
}
}catch(Exception e){
}}
public static DefaultTableModel buildTableModel(ResultSet rs) throws Exception{
ResultSetMetaData metaData = rs.getMetaData();
Vector<String> columnNames = new Vector <String>();
int columnCount = metaData.getColumnCount();
for(int column = 1; column<=columnCount;column++){
columnNames.add(metaData.getColumnName(column));
}
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while(rs.next()){
Vector<Object> vector = new Vector<Object>();
for(int columnIndex =1;columnIndex<= columnCount;columnIndex++){
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
}
这是jmenuitem的代码。 Jmenuitem变量名称是get_reports。
private void get_reportActionPerformed(java.awt.event.ActionEvent evt) {
Reports2 report = new Reports2();
report.setSize(800, 700);
report.setVisible(true);
答案 0 :(得分:1)
您的main
课程中不需要Reports2
方法。您的主框架类已经有main
来启动。取出main
方法并将main
中的所有内容包装在Report2
构造函数
您的Reports2
课程已经是JFrame
,但您正在创建另一个JFrame
。不要那样做。而只是add
到班级JFrame
JTable table = new JTable(buildTableModel(rs));
//JFrame frame = new JFrame("Reports"); <--- take this out
//frame.setSize(800, 700); <--- don't set size, just pack
setTitle("Reports"); <--- set title
add(new JScrollPane(table)); <--- add to scrollpane
pack(); <--- pack
setVisible(true); <--- set visible
请注意我是如何取出JFrame的,因为该类已经是JFrame
如上所示,我使用的是.pack()
,而不是设置尺寸
最后,你需要在actionPerformed中做的只是实例化Reports2
,就是它
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)
{
Report2 report = new Report2();
}
我运行它,它可以正常使用上面提到的修复程序。鉴于你的SQL是正确的,它也应该为你运行。
旁注:永远不要吞下您的例外
} catch (Exception ex) {
}
添加一些有意义的内容,以便您查看抛出的异常情况。
} catch (Exception ex) {
ex.printStackTrace();
}
我会考虑使用JDialog
(而不是第二个JFrame
),因为您可以控制其模态。创建JDialog
就像创建JFrame
一样简单。这几乎是完全相同的过程