2017-03-29 30 views
0

私のGUIアプリケーションがDBに接続していて、DBの製品をGUIのJTableに追加できました。 2番目のボタンをクリックすると、最初のボタンが上書きされます。私はそれがシステムまでの注文であり、クリックされたときに私がクリックしたものをテーブルに表示することを望むので、これを望んでいません。毎回値を上書きするのではなく、テーブルに追加する方法はありますか?ここに私のコードです。JTableの値が上書きされています

americanoSmall.addActionListener(
     new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       try { 
        String query = "select ProductName, Price from product where ProductID = 24"; 
        java.sql.PreparedStatement pst = connection.prepareStatement(query); 
        ResultSet rs = pst.executeQuery(); 
        table.setModel(DbUtils.resultSetToTableModel(rs)); 

        } catch (Exception e1) 
        { 
         e1.printStackTrace(); 
        } 
       } 
      }); 
+1

テーブルモデルを置き換えるのではなく、既に存在するテーブルモデルに追加するだけです。 –

+0

*「毎回値を上書きするのではなく、テーブルに追加する方法はありますか?」 - はい、手を汚してください。基本的には、データベースから取得した値をとり、POJO(普通の古いJavaオブジェクト)をラップし、それらを管理できる 'TableModel'に追加します。これは 'JTable'と' TableModel' APIの基本コンセプトです。データ構造の管理を引き継ぐ 'DbUtils'や' DefaultTableModel'のようなものは使用しないでください。普通のものと同じように、より多くの機能が必要です – MadProgrammer

答えて

3

モデルが変更されるたびにtable modelを変更しないでください。代わりにTableModeladdRowメソッドを使用します。ここには、最小限で完全で検証可能な例があります。

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

public class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Test"); 

     Container cont = frame.getContentPane(); 
     cont.setLayout(new BorderLayout()); 

     DefaultTableModel dtm = new DefaultTableModel(new Object[]{"Column 1","Column 2"}, 0); 
     JTable table = new JTable(dtm); 

     JScrollPane scroll = new JScrollPane(table); 
     cont.add(scroll, BorderLayout.CENTER); 

     dtm.addRow(new Object[]{"Value 1", "Value 2"}); 

     JButton add = new JButton("Add"); 
     cont.add(add, BorderLayout.NORTH); 

     add.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       dtm.addRow(new Object[]{"Another value", "Another value"}); 
      } 
     }); 

     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

ありがとう、上書きするのではなく今すぐ追加するそれ。 ProductNameやPriceのように、DBからコンテンツを引き出すにはどうすればいいですか? – Movillian

+0

私は各項目の値をハードコードしたくないです、私はDBから動的にSQLクエリーから引き出したい – Movillian

+1

@Movillianあなたの[前の質問](http://stackoverflow.com/questions/43076871/)で説明したようにjtable-wot-populate-when-click-jbutton)、 'TableModel'はデータの表現ですが、いくつかの要素に応じてラップする方法を提案しました。実際にはデータベース' ResultSet'を利用することができますPOJO(普通の古いJavaオブジェクト)の表現を作成し、何らかの 'List'でそれらを維持することができます。どのようにあなたのニーズを満たすためにこれを行うには、質問の範囲を超えているので、あなたが提示されているものはあなたのニーズに適応するために必要なアイデアです – MadProgrammer

関連する問題