2017-01-06 5 views
1

実行時にJTableにローを追加しようとしていますが、データはデータベースから正常に到着していますが、ローはJTableに追加されません。私はstackoverflowから多くのソリューションを試してみましたが、私は成功を収めていませんでした。JavaのJTableにローが追加されない

DefaultTableModel model = new DefaultTableModel(new String[]{ "Invoice Number", "Consignee's Name", "Invoice Date", "Amount" }, 0); 

void setLabel(String s1,String s2) { 
    JOptionPane.showMessageDialog(this, "You Choose Invoice List of Period "+s1+" to "+s2, "Success", JOptionPane.INFORMATION_MESSAGE); 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     java.sql.Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/resetdb", "root", ""); 
     java.sql.Statement stmt = con.createStatement(); 
     ResultSet rs = null; 
     String SQL; 

     SQL="Select * from bill_info where invdt BETWEEN '"+s1+"' AND '"+s2+"'"; 

     rs = (ResultSet) stmt.executeQuery(SQL); 
     if (rs.next()) { 
      rs.beforeFirst(); 
      while(rs.next()) { 
       count++; 
       String d = rs.getString("invoice"); 
       String e = rs.getString("Cname"); 
       String f = rs.getString("invdt"); 
       String g = rs.getString("Amount"); 
       model.addRow(new Object[]{ d,e,f,g }); 
      } 
     } 
    } 
    catch(Exception e) { 
     JOptionPane.showMessageDialog(this,e.getMessage()); 
    }   
} 

機能setLabel(String s1, String s2)が、私はそのパラメータとしてString形式で2つの日付を渡していた前フレームから呼び出されます。

は、ここに私のコードです。私の仕事は、選択した期間内のすべての請求書データを印刷することです。

チェックのためもう一度試しました。

System.out.println(d); 
System.out.println(e); 
System.out.println(f); 
System.out.println(g); 
+0

? – Jerry06

+0

これは参考になる可能性があります[リンク](http://stackoverflow.com/questions/295649/adding-rows-to-a-jtable) –

+0

一見、それはうまく見えます。 'model'は実際にあなたの' JTable'で使われている 'TableModel'ですか?そうでない場合、何も表示されません。 – AJNeufeld

答えて

0

はディスパッチスレッドSwingのイベントから呼び出されsetLabel()です:私は、データが正常に取得され、それが出力に成功したデータを印刷しているかどうかをチェックするだけでmodel.addRow(new Object[]{ d,e,f,g });前に私のコードに次の行を追加しましたか?もしそうでなければ、ほとんどのSwingコンポーネントはEDT上でのみ更新されなければならないので、これは問題を引き起こす可能性があります。

setLabel()がEDTから呼び出されている場合、EDTでデータベースに接続して実行中のタスクを実行すると、UIがロックされるという別の問題が発生します。代わりに、SwingWorker<>を使用してデータベースにアクセスする必要があります。

Minimal Complete Verifiable Example:あなたは `model`を定義

public class TableTest { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(TableTest::new); 
    } 

    private final static String[] COLUMNS = { "x", "x^2", "x^3", "x^4" }; 
    DefaultTableModel model = new DefaultTableModel(COLUMNS, 0); 

    TableTest() { 
     JFrame frame = new JFrame("Table Test"); 
     frame.setSize(600, 300); 
     frame.setLayout(new BorderLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTable tbl = new JTable(model); 
     frame.add(new JScrollPane(tbl), BorderLayout.CENTER); 

     JPanel btns = new JPanel(); 
     frame.add(btns, BorderLayout.PAGE_START); 
     btns.add(new JButton(fillTable)); 

     frame.setVisible(true); 
    } 

    @SuppressWarnings("serial") 
    Action fillTable = new AbstractAction("Fill Table") { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      fillTable.setEnabled(false); 
      Query query = new Query(); 
      query.execute(); 
     } 
    }; 

    class Query extends SwingWorker<Void, String[]> { 

     @Override 
     protected void process(List<String[]> chunks) { 
      for (String[] row : chunks) { 
       model.addRow(row); 
      } 
     } 

     @Override 
     protected Void doInBackground() throws Exception { 
      for (int i = 0; i < 10; i++) { 
       Thread.sleep(400); // Slow database retrieval :-) 
       String[] row = new String[4]; 
       row[0] = Integer.toString(i); 
       row[1] = Integer.toString(i * i); 
       row[2] = Integer.toString(i * i * i); 
       row[3] = Integer.toString(i * i * i * i); 
       publish(row); 
      } 
      return null; 
     } 

     @Override 
     protected void done() { 
      fillTable.setEnabled(true); 
     } 
    } 
} 
関連する問題