簡體   English   中英

單擊時,JMenuItem顯示一個空的Jframe

[英]JMenuItem displays an empty Jframe when clicked

我正在編寫一個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);
  • 您在Reports2類中不需要main方法。 你主框架類已經有一個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一樣容易。 這幾乎是完全相同的過程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM