Я совсем новичок в 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, но я не знаю event.
Я добавил println() как к событиям getTableCellEditor(), так и к событиям getCellEditorValue(), но оба они печатают старое значение.
Например :
Начните с строки 0 = 0, строки 1 = 1, строки 2 = 2.
Нажмите на 2 в строке 1, чтобы получить:
gettablecelleditorcomponent : 1
Теперь row0=0, row1=2, row2=2 Нажмите 1 на row0, чтобы получить:
getcelleditorvalue : 2
gettablecelleditorcomponent : 0
Теперь row0=1, row1=2, row2=2 Затем нажмите 0 на row1, чтобы получить:
getcelleditorvalue : 1
gettablecelleditorcomponent : 2
Теперь row0=1, row1=0, row2=2 Затем нажмите 1 на row2, чтобы получить:
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, тогда getFirstRow() в tabelChanged() по-прежнему показывает 5
Ниже приведен код моего TableModelListener:
mgrdData.getModel().addTableModelListener(new TableModelListener()
{
public void tableChanged(TableModelEvent e)
{
System.out.println("column : " + e.getColumn());
System.out.println("firstrow : " + e.getFirstRow());
}
});