アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のプログラムで実装できない所がありますので補える方は教えてください
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());

}
}

A 回答 (2件)

この場合は、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()));
}
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。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

#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);

をしておいた方がいいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/24 18:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!