gpt4 book ai didi

java - 单击时 JMenuItem 显示一个空的 Jframe

转载 作者:行者123 更新时间:2023-12-01 13:38:07 25 4
gpt4 key购买 nike

我正在编写一个 java swing 应用程序,它从文本字段收集数据并将其存储在数据库中。我有一个 JmenuItem,我想用它来显示数据库中的数据。我有一个类从数据库收集数据并将数据插入到 jtable 中。该类扩展了 jframe。现在我遇到的问题是从 jmenuitem 执行该类。当我单击 jmenuitem 时,它会显示一个没有表格的空 jframe。

这里是带有 jtable 的类的代码。类(class)是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);

最佳答案

  • 您的 Reports2 类中不需要 main 方法。您的主框架类已经有一个可以从中启动的 main 。取出 main 方法,并将该 main 中的所有内容包装在 Report2 构造函数中

  • 您的 Reports2 类已经是一个 JFrame,但您正在创建另一个 JFrame。不要那样做。而只是添加到类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 是正确的,它也应该为您运行。

<小时/>

旁注:永远、永远不要吞下你的异常(exception)

} catch (Exception ex) {

}

放置一些有意义的内容,让您可以看到抛出了哪些异常(如果有)。

} catch (Exception ex) {
ex.printStackTrace();
}
<小时/>

另外我会考虑使用JDialog(而不是第二个JFrame),因为您可以控制它的模式。创建 JDialog 与创建 JFrame 一样简单。这几乎是完全相同相同的过程

关于java - 单击时 JMenuItem 显示一个空的 Jframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21088324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com