iLEDについて

Javaサンプル

Netbeans

Libre Office Basicマクロ

その他


Author of This Site:
M. Kom. (kom9kmail@gmail.com)
Spam対策のため@マークは全角になっていますから、メール送信時には半角にしてください。

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"}
  };
  
  ArrayList aryList= 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;
}


動作画面例

fig

Utilizing JTable Sample

Kom., 2013