Java ソースコード JTableSample.java
JTableの使用方法サンプル(機能追加版)。4項目あるデータ(車の名前、分類、価格、燃費)
を対象に、燃費順に並び替えを行って指定した分類のみを表示する。
4項目を入力してデータ追加が行えるようにする。
Table上で選択した行を削除できるようにする。
ファイルにデータ一式の保存と読込みができるようにする。
今回のサンプルでは、NetBeansが自動生成した部分のコードも含めて表示した。そのままコピペすれば
動きますが、GUIデザインの改造などを行うためには、NetBeansのデザイナできちんと作成したほうがよい。
//JTableの使用例:4項目あるデータ(車の名前、分類、価格、燃費) //を対象に、燃費順に並び替えを行って指定した分類のみを表示する。 //4項目を入力してデータ追加が行えるようにする。 //Table上で選択した行を削除できるようにする。 //ファイルにデータ一式の保存と読込みができるようにする。 //2013 Kom. import javax.swing.table.DefaultTableModel; import java.util.*; import java.io.*; import javax.swing.*; public class JTableSample extends javax.swing.JFrame { //JComboBoxのjComboBox1、JTableのjTable1、JTextFieldのjTextCarName、jTextJanre、 // jTextPrice、jTextFuel 、JButtonのjButtonAdd、JButtonDelete を使用。 private String[] columnNames = {"車名", "車種", "価格", "燃費(km/l)"}; //NetBeansでは、デザイナ画面のjTable1のプロパティのmodelに、 //ユーザコード→カスタムコードで、 //tableModelを設定。( jTable1.setModel(tableModel); ) DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); //以下のtabledataに車の初期データを記述。起動時にはこれらが表示される。 String[][] tableData = { {"カロラ", "小型車", "2109000", "16.5"}, {"ミリラ", "軽自動車", "980000", "22.8"}, {"Fitz", "小型車", "1900000", "23.3"}, {"VVV", "小型車", "2580000", "23.0"}, {"Big", "セダン", "3588000", "11.5"}, {"SSS", "セダン", "3858000", "10.3"}, {"ABC", "小型車", "1500000", "24.5"}, {"Tanta", "軽自動車", "880000", "20"} }; ArrayListaryList= new ArrayList (); public JTableSample() { initComponents(); //ArrayListに配列 tabledataのデータをコピー for(int i = 0 ; i < tableData.length ; i++){ aryList.add(tableData[i]);//参照渡し. } //もし初期データに配列を用いず、直接ArrayListにデータを //入れるなら以下のように。 //aryList.add(new String[]{"カローラ", "小型車", "1009000", "16.5"}); //これは、データを後から追加するときにもつかう方法。 //ArrayListにデータを入れる時に配列のコピーを渡す場合の書き方は //aryList.add(tableData[i].clone()); //この場合、元の配列データを変更しても影響なし。 //参照渡しならば以下の書き方 //aryList.add(strtest); ArrayComparator comparator = new ArrayComparator(); comparator.setColumn( 3 );//この例では並べ替えのキーは配列の4番目の項目 Collections.sort(aryList, comparator );//aryListの並べ替えを実行 for(int i = 0 ; i < aryList.size() ; i++){ tableModel.addRow(aryList.get(i)); } } private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); jComboBox1 = new javax.swing.JComboBox(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jButtonSave = new javax.swing.JButton(); jButtonLoad = new javax.swing.JButton(); jTextCarName = new javax.swing.JTextField(); jTextJanre = new javax.swing.JTextField(); jTextPrice = new javax.swing.JTextField(); jTextFuel = new javax.swing.JTextField(); jButtonAdd = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jButtonDelete = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); // jTable1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jTable1.setModel(tableModel); jTable1.setGridColor(new java.awt.Color(51, 0, 255)); jTable1.setIntercellSpacing(new java.awt.Dimension(1, 3)); jTable1.setRowHeight(24); // jScrollPane1.setViewportView(jTable1); jComboBox1.setFont(new java.awt.Font("MS UI Gothic", 0, 18)); // NOI18N jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "全車種", "軽自動車", "小型車", "ワンボックス", "セダン" })); jComboBox1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jComboBox1ActionPerformed(evt); } }); jLabel1.setFont(new java.awt.Font("MS UI Gothic", 0, 14)); // NOI18N jLabel1.setText("JTableとArrayListの使用方法サンプル"); jLabel2.setFont(new java.awt.Font("MS UI Gothic", 0, 18)); // NOI18N jLabel2.setText("燃費の悪い車から順に表示。"); jButtonSave.setText("データ保存"); jButtonSave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonSaveActionPerformed(evt); } }); jButtonLoad.setText("データ読込"); jButtonLoad.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonLoadActionPerformed(evt); } }); jButtonAdd.setText("追加"); jButtonAdd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonAddActionPerformed(evt); } }); jLabel3.setText("車名"); jLabel4.setText("分類"); jLabel5.setText("価格(半角数字)"); jLabel6.setText("燃費(半角数字)"); jButtonDelete.setText("選択行の削除"); jButtonDelete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonDeleteActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(119, 119, 119) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 235, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGap(135, 135, 135) .addComponent(jLabel2))) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(42, 42, 42) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel4) .addGap(43, 43, 43)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jTextCarName, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jTextJanre, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jButtonLoad) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonSave))) .addGap(9, 9, 9))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel6)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jTextPrice, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jTextFuel, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButtonAdd, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jButtonDelete, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(20, 20, 20)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(166, 166, 166) .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jTextCarName, jTextFuel, jTextJanre, jTextPrice}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 303, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jLabel4) .addComponent(jLabel5) .addComponent(jLabel6)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jTextCarName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jTextJanre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jTextPrice, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jTextFuel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButtonAdd)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jButtonDelete, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(5, 5, 5) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jButtonSave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jButtonLoad, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addContainerGap()) ); pack(); } public class ArrayComparator implements Comparator { /** ソート対象のカラムの位置 */ private int column = 0; //デフォルトでは1番目の要素を並べ替えのキーとする。 /** ソートキーの入っているカラム番号 */ public void setColumn( int col ) { this.column = col; } public int compare( Object a, Object b ) { //column番目の列に実数が文字列として入っているものとする。 String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; if(Double.valueOf(strA[ column ])-Double.valueOf(strB[ column ] )>0.0){ return(1); }else{ return (-1); } } } private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) { //jComboBox1のセレクトが変更されたとき、 //まずデータを燃費順に並べ替えるためのArrayComparartorを用意。 ArrayComparator comparator = new ArrayComparator(); //tableModelをクリアすることで、Tableの表示データをいったん全て削除。 tableModel.setRowCount(0); //次にセレクトされた車種に該当する車のみをtableModelに追加する。 if(jComboBox1.getSelectedItem().equals("全車種")){ for(int i = 0 ; i < aryList.size() ; i++){ tableModel.addRow(aryList.get(i)); } }else { for(int i = 0 ; i < aryList.size() ; i++){ if(aryList.get(i)[1].equals(jComboBox1.getSelectedItem())){ tableModel.addRow(aryList.get(i)); } } } } private void jButtonSaveActionPerformed(java.awt.event.ActionEvent evt) { File file=null; JFileChooser filechooser = new JFileChooser("c:\\");//デフォルトはC:\ int selected = filechooser.showSaveDialog(this); if (selected == JFileChooser.APPROVE_OPTION){ file = filechooser.getSelectedFile(); saveArrayList(file.getAbsolutePath()); jComboBox1.setSelectedIndex(0); }else if (selected == JFileChooser.CANCEL_OPTION){ //Cansel }else if (selected == JFileChooser.ERROR_OPTION){ //Error } } private void jButtonLoadActionPerformed(java.awt.event.ActionEvent evt) { File file=null; JFileChooser filechooser = new JFileChooser("c:\\"); int selected = filechooser.showOpenDialog(this); if (selected == JFileChooser.APPROVE_OPTION){ file = filechooser.getSelectedFile(); loadArrayList(file.getAbsolutePath()); jComboBox1.setSelectedIndex(0); }else if (selected == JFileChooser.CANCEL_OPTION){ //Cansel }else if (selected == JFileChooser.ERROR_OPTION){ //Error } } private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) { //Tableへのデータ追加 aryList.add( new String[]{jTextCarName.getText(), jTextJanre.getText(), jTextPrice.getText(), jTextFuel.getText()}); jComboBox1.setSelectedIndex(0); jTextCarName.setText(""); jTextJanre.setText(""); jTextPrice.setText(""); jTextFuel.setText(""); } private void jButtonDeleteActionPerformed(java.awt.event.ActionEvent evt) { // Tableからのデータ削除 //jTable1で現在選択されている行を取り出す。 int delrow=jTable1.getSelectedRow(); if(delrow<0){ return; } //データ本体を管理しているArrayListから該当行を削除 aryList.remove(delrow); //jTable1の表示を更新するために、jComboBox1の選択状態を変更 jComboBox1.setSelectedIndex(0); } private void saveArrayList(String fpath) { try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fpath)); oos.writeObject(aryList); oos.close(); } catch (Exception e) { System.out.println("例外"+ e +"発生。"); } } private void loadArrayList(String fpath) { try { //ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:\\arr.txt")); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fpath)); aryList = (ArrayList )ois.readObject(); ois.close(); } catch (Exception e) { System.out.println("例外"+ e +"発生。"); } } public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(JTableArray.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(JTableArray.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(JTableArray.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(JTableArray.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new JTableArray().setVisible(true); } }); } private javax.swing.JButton jButtonAdd; private javax.swing.JButton jButtonDelete; private javax.swing.JButton jButtonLoad; private javax.swing.JButton jButtonSave; private javax.swing.JComboBox jComboBox1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; private javax.swing.JTextField jTextCarName; private javax.swing.JTextField jTextFuel; private javax.swing.JTextField jTextJanre; private javax.swing.JTextField jTextPrice; }
動作画面例
Kom., 2013