2014-01-13 2 views
0

Я пишу приложение java swing, которое собирает данные из текстовых полей и сохраняет их в базе данных. У меня есть JmenuItem, который я хочу использовать для отображения данных в базе данных. У меня есть класс, который собирает данные из базы данных и вставляет данные в jtable. Класс расширяет jframe. Теперь проблема в том, что я выполняю этот класс из jmenuitem. Когда я нажимаю jmenuitem, он показывает пустой jframe без таблицы.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); 

ответ

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 правильный, он должен работать и для вас.


Side Примечание: НИКОГДА не поглотит ваши исключения

} catch (Exception ex) { 

} 

Положите что-то значимое, что позволит вам увидеть, что исключения бросают, если таковые имеются.

} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

Также я хотел бы рассмотреть с помощью JDialog (вместо второго JFrame), как вы можете контролировать его модальность. Так же легко создать JDialog, как и для создания JFrame. Это почти точный такой же процесс

+0

Я сделал, как вы просили, и это сработало! – Tundaey