[英]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.