如何确定JTable中的哪个单元格被选中?

时间:2011-02-18 17:03:28

标签: java swing events jtable listener

我在GUI中有一个JTable,我想根据用户点击的单元格的值返回一个数字。这是代码:

ListSelectionModel newmodel = mytable.getSelectionModel();
newmodel.addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        int row = mytable.getSelectedRow();
        int column = mytable.getSelectedColumn();

        int cell = getNewNum();
        datefield.setText(String.valueOf(cell));
    }
});

我有几个问题。首先,这种方法使我的表格可编辑。在我使用此方法之前,我无法编辑表,但现在我可以删除条目。我查看了API,但我不知道为什么会这样。其次,如果我单击第3行中的单元格,然后单击单元格3中的另一行,则不会注册任何事件。如何通过单击当前所选行的单元格来创建事件?

1 个答案:

答案 0 :(得分:7)

一种常见的方法是获取用户点击事件的位置:

jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
    @Override
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        int row = jTable1.rowAtPoint(evt.getPoint());
        int col = jTable1.columnAtPoint(evt.getPoint());
        if (row >= 0 && col >= 0) {
            ......

        }
    }
});

以下是使用选择模式的第二个选项:

jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
    jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
       @Override
       public void mouseClicked(java.awt.event.MouseEvent evt) {
           ...
           int row = jTable1.getSelectedRow();
           int col = jTable1.getSelectedColumn());
           if (evt.getClickCount() > 1) { // double-click etc...
              ...

如果你去:

public boolean isCellEditable(int row, int col) {
   return false;
}

然后您的JTable将无法编辑。

最后,为了获得您想要的值,您只需要调用JTable模型的getValueAt(row,col),或者获取如下内容:

Object foo = jTable1.getModel().getValueAt(row, col);