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;
}
動作画面例

Utilizing JTable Sample
Kom., 2013
