こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラムを補って下さい(swing)

下記のプログラムで実装できない所がありますので補える方は教えてください
1.チェックボックスで削除を選択した、行番号をコンソールに表示したい。
2.コンボボックスで選択されたコンボボックスの文字列と選択されたコンボボックス
  のインデックス番号が知りたい

以上です。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.Class;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;

public class JTableSample1 implements ActionListener{
JComboBox comboBox;

public static void main(String[] args) {
new JTableSample1().init();
}

public void init() {
String[] title = { "削除", "String", "Integer", "JComboBox" };
String prompt = "選んで下さい";
Object[][] records = {
{ Boolean.FALSE, "Rachel Green", new Integer(1970), prompt },
{ Boolean.FALSE, "Monica Geller", new Integer(1969), prompt },
{ Boolean.FALSE, "Phoebe Buffay", new Integer(1967), prompt },
{ Boolean.FALSE, "Joey Tribbiani", new Integer(1967), prompt },
{ Boolean.FALSE, "Chandler Bing", new Integer(1968), prompt },
{ Boolean.FALSE, "Ross Geller", new Integer(1967), prompt } };

TableModel model = new DefaultTableModel(records, title) {
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};

JTable table = new JTable(model);

comboBox = new JComboBox();
comboBox.addItem("ごはん食べてる");
comboBox.addItem("テレビみてる");
comboBox.addItem("仕事してる");
comboBox.addItem("寝てる");

TableCellEditor editor = new DefaultCellEditor(comboBox);

table.getColumnModel().getColumn(3).setCellEditor(editor);

JFrame frame = new JFrame("Joey Table");
frame.getContentPane().add(new JScrollPane(table));
frame.setSize(640, 240);
frame.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
System.out.println("選択されたコンボボックス:"+(String)comboBox.getSelectedItem());
System.out.println("選択されたコンボボックスのインデックス番号:"+comboBox.getSelectedIndex());

}
}

投稿日時 - 2009-06-24 16:56:55

QNo.5071098

すぐに回答ほしいです

質問者が選んだベストアンサー

この場合は、UIによる操作でTableModelオブジェクトが変更される(チェックボックスの選択や解除等)ので、ActionListenerではなくTableModelListenerを使用します。

TableModelListenerを実装した形に修正したソースを張っておきます。
簡単な修正しかしていませんが、行番号やインデックス番号の取り方はすぐに分かると思います。

----------
import java.lang.Class;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

// ActionListenerではなく、TableModelListenerを実装する
public class JTableSample1 implements TableModelListener {
JComboBox comboBox;
TableModel model; // インスタンス変数にする

public static void main(String[] args) {
new JTableSample1().init();
}

public void init() {
String[] title = { "削除", "String", "Integer", "JComboBox" };
String prompt = "選んで下さい";
Object[][] records = {
{ Boolean.FALSE, "Rachel Green", new Integer(1970), prompt },
{ Boolean.FALSE, "Monica Geller", new Integer(1969), prompt },
{ Boolean.FALSE, "Phoebe Buffay", new Integer(1967), prompt },
{ Boolean.FALSE, "Joey Tribbiani", new Integer(1967), prompt },
{ Boolean.FALSE, "Chandler Bing", new Integer(1968), prompt },
{ Boolean.FALSE, "Ross Geller", new Integer(1967), prompt } };

model = new DefaultTableModel(records, title) {
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};

JTable table = new JTable(model);
model.addTableModelListener(this); // 追加

comboBox = new JComboBox();
comboBox.addItem("ごはん食べてる");
comboBox.addItem("テレビみてる");
comboBox.addItem("仕事してる");
comboBox.addItem("寝てる");

TableCellEditor editor = new DefaultCellEditor(comboBox);

table.getColumnModel().getColumn(3).setCellEditor(editor);

JFrame frame = new JFrame("Joey Table");
frame.getContentPane().add(new JScrollPane(table));
frame.setSize(640, 240);
frame.setVisible(true);
}

// TableModelListenerのメソッドを実装
public void tableChanged(TableModelEvent e) {
System.out.println(model.getValueAt(e.getFirstRow(), e.getColumn()));
}
}

投稿日時 - 2009-06-24 17:53:31

お礼

ご回答ありがとうございます。x_jouet_xさんのプログラムでtableChangedメソッドの中身を
if(e.getColumn()==0){
int val = e.getFirstRow()+1;
System.out.println("チェックボックスの"+val+"行目がクリックされて"+model.getValueAt(e.getFirstRow(), e.getColumn())+"になりました");
}
if(e.getColumn()==3){
int val = e.getFirstRow()+1;
System.out.println("コンボボックスの"+val+"行目がクリックされて"+model.getValueAt(e.getFirstRow(), e.getColumn())+"になりました");
}を追加しました。
この方法でいいのでしょうか?
また、選択されたコンボボックスのインデックス番号が取得できないのですが教えていただけないでしょうか。

投稿日時 - 2009-06-24 18:23:28

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

#1で回答した者です。

やっぱりtableChanged()メソッド内の実装が分からないといけないので、ご希望にそった形でtableChanged()を実装したものを下記に張り付けておきます。

----------
// TableModelListenerのメソッドを実装
public void tableChanged(TableModelEvent e) {
Object obj = model.getValueAt(e.getFirstRow(), e.getColumn());

// 「削除」チェックボックス選択/解除時
if (e.getColumn() == 0) {
if ((Boolean)obj) {
System.out.println("チェックボックス選択: " + e.getFirstRow());
} else {
System.out.println("チェックボックス解除: " + e.getFirstRow());
}
}

// コンボボックス変更時
if (e.getColumn() == 3) {
System.out.println("選択されたコンボボックス: " + comboBox.getSelectedItem());
System.out.println("選択されたコンボボックスのインデックス番号: " + comboBox.getSelectedIndex());
}
}
----------

あともう1点ですが、現在のソースだとフレームを閉じてもJavaのプロセスが終了しないのではありませんか?
意図的にそうしているなら問題ありませんが…。
一応、JFrameオブジェクトに対して

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

をしておいた方がいいと思います。

投稿日時 - 2009-06-24 18:19:27

お礼

度々ご回答いただきありがとうございました。
なんとかチェックボックスとコンボボックスのデータが取得できる
ようになりました。ありがとうございました。

投稿日時 - 2009-06-24 18:27:04

あなたにオススメの質問