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的事件里面获得它所在单元格的坐标?

解决方案 »

  1.   

    通过 row = table.getSelectedRow(); 获取
    我的是成功的
      

  2.   

    我用getSelectedRow()和getSelectedColumn()获取的不是当前编辑的单元格,而是在我点击此单元格前曾经点过的单元格。
      

  3.   

    给个demo你看看,我用的不是JComboBox,而是JButton,也许思路有用。package tkl.client.guiutil;import java.awt.Component;
    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();
    }
    });
      

  4.   

    现在焦点不在JTable的单元格上,而是在这个单元格里面的JComboBox里。
      

  5.   

    To 3楼,原来你的ButtonCellEditor实现了TableCellEditor接口啊我这里直接用的是DefaultCellEditor,明白了。
      

  6.   

    没有看明白,你究竟要在什么时候获得编辑中的行列号?
    如果你给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可以得到你想要的。
    这么多,你自己选择那种适合于你的工作吧。
      

  7.   

    To 8楼我想在JComboBox的事件里面获取它所在单元格的坐标。就是在JTable单元格编辑结束后获取这个单元格的坐标。
      

  8.   

    setValueAt(int row,int column)改写model的此方法。在更改数据之前得到。addModelListener方式
    tableChanged(TableModelEvent e)  方法
    可以通过event得到。具体请参阅jdk文档。
      

  9.   

    我重写了DefaultCellEditor的getTableCellEditorComponent方法。
    在这个方法里面获得了row和column。
      

  10.   

    嗯。我在点击这个单元格的时候,获取它的坐标,根据这个坐标创建JComboBoxModel,然后才能确定ComboBox显示多少行。