我对java很陌生,所以请不要太苛刻:)
我有一个 JTable,每个单元格中有一列有 3 个 JRadioButtons。
JRadioButtons 显示正确,并且选择了正确的 JRadioButtons。
要将 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 类中,但我不知道事件。
我将 println() 添加到 getTableCellEditor() 和 getCellEditorValue() 事件中,但都打印了旧值。
例如 :
从 row0=0、row1=1、row2=2 开始
单击 row1 上的 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
现在第 0 行=1,第 1 行=0,第 2 行=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());
}
});