私はJavaにまったく慣れていないので、厳しすぎないでください:)
各セルに3つのJRadioButtonを持つ列を持つJTableがあります。
JRadioButtonが正しく表示され、正しいJRadioButtonが選択されます。
JRadioButtonsをJTableに配置するには、setCellRenderer()とsetCellEditor()を使用します。
private void addRadio(int intCol)
{
mgrdData.getColumnModel().getColumn(intCol).setCellRenderer(new RadioButtonRenderer());
RadioButtonEditor butEdit = new RadioButtonEditor(new JCheckBox());
butEdit.UseTcp(mtcpGrid);
mgrdData.getColumnModel().getColumn(intCol).setCellEditor(butEdit);
}
以下は、RadioButtonEditorクラスのコードです。
public class RadioButtonEditor extends DefaultCellEditor implements ItemListener
{
public JPanel pnl = new JPanel();
public ButtonGroup group1 = new ButtonGroup();
public JRadioButton btnVA = new JRadioButton("VA");
public JRadioButton btnUIT = new JRadioButton("UIT");
public JRadioButton btnAAN = new JRadioButton("AAN");
public tcp mtcpCon;
public RadioButtonEditor(JCheckBox checkBox)
{
super(checkBox);
}
public void UseTcp(tcp tcpCon)
{
mtcpCon = tcpCon;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
{
if (value==null) return null;
group1.add(btnVA );
group1.add(btnUIT );
group1.add(btnAAN );
pnl.add(btnVA );
pnl.add(btnUIT );
pnl.add(btnAAN );
btnVA.setSelected(false);
btnUIT .setSelected(false);
btnAAN .setSelected(false);
String strVal1 = (String)value;
switch(Integer.parseInt(strVal1))
{
Case 0:
btnVA.setSelected(true);
break;
Case 1:
btnUIT.setSelected(true);
break;
Case 2:
btnAAN.setSelected(true);
break;
}
System.out.println("gettablecelleditorcomponent strVal1 : " + strVal1);
return pnl;
}
public Object getCellEditorValue()
{
String strVal2="";
if(btnVA.isSelected() == true) strVal2="0";
if(btnUIT.isSelected() == true) strVal2="1";
if(btnAAN.isSelected() == true) strVal2="2";
System.out.println("getcelleditorvalue strVal2 : " + strVal2);
return strVal2;
}
public void itemStateChanged(ItemEvent e)
{
super.fireEditingStopped();
}
}
以下は、RadioButtonRendererクラスのコードです。
public class RadioButtonRenderer implements TableCellRenderer
{
public JPanel pnl = new JPanel();
public ButtonGroup group1 = new ButtonGroup();
public JRadioButton btnVA = new JRadioButton("VA");
public JRadioButton btnUIT = new JRadioButton("UIT");
public JRadioButton btnAAN = new JRadioButton("AAN");
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (value==null) value="0";
btnVA.putClientProperty("JComponent.sizeVariant","small");
btnAAN.putClientProperty("JComponent.sizeVariant","small");
btnUIT.putClientProperty("JComponent.sizeVariant","small");
group1.add(btnVA );
group1.add(btnUIT );
group1.add(btnAAN );
pnl.add(btnVA );
pnl.add(btnUIT );
pnl.add(btnAAN );
btnVA.setSelected(false);
btnUIT .setSelected(false);
btnAAN .setSelected(false);
switch(Integer.parseInt((String)value))
{
Case 0:
btnVA.setSelected(true);
break;
Case 1:
btnUIT.setSelected(true);
break;
Case 2:
btnAAN.setSelected(true);
break;
}
return pnl;
}
}
どのJRadioButtonがクリックされたかを検出し、その新しい値を処理したいと思います。発生したイベントはRadioButtonEditorクラスにあるはずですが、イベントがわかりません。
getTableCellEditor()イベントとgetCellEditorValue()イベントの両方にprintln()を追加しましたが、どちらも古い値を出力します。
例えば :
row0 = 0、row1 = 1、row2=2から開始します
行1の2をクリックすると、次のようになります。
gettablecelleditorcomponent : 1
ここで、row0 = 0、row1 = 2、row2 = 2 row0の1をクリックすると、次のようになります。
getcelleditorvalue : 2
gettablecelleditorcomponent : 0
ここで、row0 = 1、row1 = 2、row2 = 2次に、row1の0をクリックすると次のようになります。
getcelleditorvalue : 1
gettablecelleditorcomponent : 2
ここで、row0 = 1、row1 = 0、row2 = 2次に、row2の1をクリックすると次のようになります。
getcelleditorvalue : 0
gettablecelleditorcomponent : 2
ここで、row0 = 1、row1 = 0、row2=1です。
これから見ることができます:
getTableCellEditor() has the previous value of that row
getCellEditorValue() has the global previous value
クリックした後、JRadioButtonの新しい値を取得するためにどのイベントを使用できますか?
[編集]
TableModelListenerをテーブルに追加しましたが、getFirstRow()には、ユーザーがラジオボタンをクリックした行ではなく、最後に選択された行が表示されます。
したがって、たとえば、行5のラジオボタンを最後にクリックし、次に行7のラジオボタンをクリックしたとき、tabelChanged()のgetFirstRow()は引き続き5を表示します。
以下は私のTableModelListenerのコードです:
mgrdData.getModel().addTableModelListener(new TableModelListener()
{
public void tableChanged(TableModelEvent e)
{
System.out.println("column : " + e.getColumn());
System.out.println("firstrow : " + e.getFirstRow());
}
});