JTable的某一列,我设置成为JComboBox格式,就是点击此单元格的时候是个下拉框(重写getCellEditor()方法实现的)。我把JComboBox设置了ActionListener监听,想在下拉的时候获得它所在的单元格的行号和列号。
我通过
int r = jTable.getEditingRow();
int c = jTable.getEditingColumn();
来获取,可惜每次r和c都是-1。
我想,情况是可能这样的,我点击jTable的某个单元格的时候,触发了JTable的单元格编辑事件,返回此单元格的格式(JComboBox的下拉框),然后单元格编辑事件结束。这时候又触发了JComboBox的事件,但是这时候我想通过jTable.getEditingRow()和jTable.getEditingColumn()来获取当前编辑的单元格坐标,就无法获取了,因为单元格编辑事件已经结束了?我的推断正确吗?现在我该通过什么方式在JComboBox的事件里面获得它所在单元格的坐标?
我通过
int r = jTable.getEditingRow();
int c = jTable.getEditingColumn();
来获取,可惜每次r和c都是-1。
我想,情况是可能这样的,我点击jTable的某个单元格的时候,触发了JTable的单元格编辑事件,返回此单元格的格式(JComboBox的下拉框),然后单元格编辑事件结束。这时候又触发了JComboBox的事件,但是这时候我想通过jTable.getEditingRow()和jTable.getEditingColumn()来获取当前编辑的单元格坐标,就无法获取了,因为单元格编辑事件已经结束了?我的推断正确吗?现在我该通过什么方式在JComboBox的事件里面获得它所在单元格的坐标?
我的是成功的
import java.awt.event.ActionListener;import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;public abstract class ButtonCellEditor extends AbstractCellEditor implements
TableCellEditor, ActionListener
{
private JButton cellButton;
private String text;
private int row;
private Object value; public ButtonCellEditor()
{
this.cellButton = new JButton();
this.cellButton.addActionListener(this);
this.cellButton.setBorderPainted(false);
} public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column)
{
this.value = value;
this.text = value.toString();
this.row = row;
this.cellButton.setText(this.text);
return this.cellButton;
} public Object getCellEditorValue()
{
return this.value;
} protected int getEditingRow()
{
return this.row;
}
}package tkl.client.guiutil;import java.awt.Component;import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;public class ButtonCellRenderer extends JButton implements TableCellRenderer
{ Border unselectedBorder = null;
Border selectedBorder = null; public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
setText(value.toString());
setOpaque(true);
if (isSelected)
{
if (this.selectedBorder == null)
{
this.selectedBorder = BorderFactory.createMatteBorder(2, 5, 2,
5, table.getSelectionBackground());
}
setBorder(this.selectedBorder);
}
else
{
if (this.unselectedBorder == null)
{
this.unselectedBorder = BorderFactory.createMatteBorder(2, 5,
2, 5, table.getBackground());
}
setBorder(this.unselectedBorder);
}
return this;
}
}table.getColumnModel().getColumn(2).setCellRenderer(
new ButtonCellRenderer());
table.getColumnModel().getColumn(2).setCellEditor(
new ButtonCellEditor()
{
public void actionPerformed(ActionEvent evt)
{
int row = getEditingRow();
int mdlrow = table.convertRowIndexToModel(row);
SmsDocument sms = lstRecord.get(mdlrow);
SMSType record = sms.getSms();
String[] cells = record.getCellArray();
final JScrollPane scrlpn = new JScrollPane();
final JList list = new JList(cells);
list.setVisibleRowCount(5);
scrlpn.setViewportView(list);
JOptionPane.showMessageDialog(SMSRecordPanel.this,
scrlpn, "发送号码", JOptionPane.CLOSED_OPTION);
fireEditingStopped();
}
});
如果你给combobox加listener,那么这时编辑已经结束,所以你获取的editingRow和column都是-1.你的推断基本是正确的。
获取编辑的行列号的位置可选范围很宽。从开始编辑的部分,celleditor的
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column)
这里面就有行列号。获取相应位置的编辑组件。在stopCellEditing方法里面你调用getEditngRow(column)都可得到相应的位置信息。在stop之前都是可
以的。当然table你也可以改写方法:
public void editingStopped(ChangeEvent e) 。这里面也可以得到相应的getEditngRow(column)若你想在编辑结束后处理,可以tablemodel里面setValueAt(int row,int column)
或者model加监听,addModelListener,也可以得到相应的事件信息,在
tableChanged(TableModelEvent e)
里面通过event可以得到你想要的。
这么多,你自己选择那种适合于你的工作吧。
tableChanged(TableModelEvent e) 方法
可以通过event得到。具体请参阅jdk文档。
在这个方法里面获得了row和column。