2017-08-26 19 views
1

MySQLのデータをJTableに表示したいが、テーブルの最後の行が表示されます。お願い助けて。 jt = new JTable(データ、列)は、各行ごとに新しいテーブルを作成する(前に削除する)が、正しいオプションが見つからないため、問題があることを理解しています。JTableのデータをMySQLから表示する方法

public class Test2 extends JPanel { 

    static final String USERNAME = "root"; 
    static final String PASSWORD = "root"; 
    static final String CONN_STRING = "jdbc:mysql://localhost:3306/mydbtest?useSSL=false"; 

    JTable jt; 
    public Test2() { 

     try { 
      Connection conn; 
      conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD); 
      Statement stmt = (Statement) conn.createStatement(); 
      String query = "Select title, season, episode from movie"; 
      ResultSet rs = stmt.executeQuery(query); 

      rs.beforeFirst(); 

      while (rs.next()) { 
       String title = rs.getString("Title"); 
       String season = rs.getString("Season"); 
       String episode = rs.getString("Episode"); 

      String[] columns = {"Title", "S", "E"}; 
      String[][] data = {{title, season, episode}}; 


      jt = new JTable(data, columns); 
      }; 

      jt.setPreferredScrollableViewportSize(new Dimension(450, 63)); 
      jt.setFillsViewportHeight(true); 

      JScrollPane jps = new JScrollPane(jt); 
      add(jps); 
     } 
     catch (Exception er) {System.err.println(er);} 
    } 

    public static void main(String[] args) { 
     JFrame jf = new JFrame(); 
     Test2 t = new Test2(); 
     jf.setTitle("Test"); 
     jf.setSize(500,500); 
     jf.setVisible(true); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.add(t); 
    } 
} 

答えて

2

あなたの問題はここにある:

while (rs.next()) { 
    String title = rs.getString("Title"); 
    String season = rs.getString("Season"); 
    String episode = rs.getString("Episode"); 

    String[] columns = { "Title", "S", "E" }; 
    String[][] data = { { title, season, episode } }; 

    jt = new JTable(data, columns); // *** you're making many JTables here!! *** 
} 

たびwhileループループは、あなたが廃棄新しいJTableのオブジェクトを作成します。例外はループの最後の時点で、結果セットの最後の行からのデータは破棄されず、作成された最後のJTableに表示されます。これを解決するには、すべてののデータをJTable内に表示するには、結果セットのすべてのデータをwhileループ内で照合してからJTableに追加する必要があります。これを行う最も簡単な方法は、テーブルモデル、ここでは簡単なのDefaultTableModel、前whileループ、およびwhileループ内の結果セットのデータの各行の中でそれを移入:

// create a table model with the appropriate column headers 
// and with 0 rows (to start with) 
String[] columnNames = {"Title", "Season", "Episode"}; 
DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); 

while (rs.next()) { 
    String title = rs.getString("Title"); 
    String season = rs.getString("Season"); 
    String episode = rs.getString("Episode"); 

    // create a single array of one row's worth of data 
    String[] data = { title, season, episode } ; 

    // and add this row of data into the table model 
    tableModel.addRow(data); 
} 

jt.setModel(tableModel); // place model into JTable 

または、おそらくより良いが、最後の行への変更します

jt = new JTable(tableModel); // to create a new JTable 
+0

アイデアは非常にスマートですが、エラーjava.lang.NullPointerExceptionを表示しています。何故? – Yevgen

+0

@ Yevgen:これは別の問題です。あなたがデバッグする必要がある問題です。もしあなたがそうしていないのであれば、この主題に関する標準的な質問に対する答えをチェックしてください:[NullPointerExceptionとは何ですか?それを修正する方法は?](http://stackoverflow.com/questions/218384/what-is-私はそれを知っていますか? –

+0

@Yevgen:NullPointerExceptionをデバッグするヒューリスティックはほとんど同じです。例外のスタックトレースを読み、例外がスローされた行、慎重にその行を検査して、どの変数なぜなら、あなたのコードに戻ってその理由を調べるためです。あなたは何度も何度も走り回って、私を信頼します。 –

関連する問題