1

我在JTable其中有一个单元格JPanelJPanel里面有 2 个标签。单击左标签时我想执行不同的操作,单击右操作时我想执行另一个操作。我不想使用TableCellEditor,它使我的代码如此复杂。因为我的单元格值有一个类型范围。

我编写以下代码从鼠标事件中获取选定的组件,但没有成功。我也试过SwingUtilies.convertMouseEvent了,但它没有改变任何东西。下面的代码有什么问题?为什么JComponentcontains 方法不检查鼠标点。

contSimTable.addMouseListener(new MouseAdapter() {
    public void mouseClicked(final MouseEvent event) {
        if (SwingUtilities.isLeftMouseButton(event)) {
            if (event.getClickCount() == 2) {
                JTable target = (JTable) event.getSource();
                int row = contSimTable.getSelectedRow();
                int column = contSimTable.getSelectedColumn();
                /**
                 * convert from view colum to model.It is column index
                 * which is stored in table model
                 */
                int modelColumn = target.convertColumnIndexToModel(column);

                Object clickedCell = contSimTable.getValueAt(row, modelColumn);
                if (clickedCell instanceof JPanel) {
                    boolean isSecond = false;
                    JLabel a = (JLabel) ((JPanel) clickedCell)
                        .getComponent(0);

                    JLabel b = (JLabel) ((JPanel) clickedCell)
                        .getComponent(1);
                    if (a.contains(event.getPoint())) {
                        isSecond = false;
                    }
                    //                                                      
                    if (b.contains(event.getPoint())) {
                        isSecond = true;
                    }

                }

            }
        }
    }
});
4

3 回答 3

2

ATableCellEditor是正确的方法。有多种方法可以处理不同的数据类型:

  • 默认情况下,如此所述。

  • 通过,TableColumn如图所示

  • 通过从 返回的类型标记,如此getColumnClass()所示。

  • 通过覆盖,如此getCellEditor()所示。

如需更具体的指导,请编辑您的问题以包含代表您选择的方法的sscce 。

于 2013-08-26T18:35:29.627 回答
0

您正在将 MouseListener 添加到 JTable。将所需的侦听器直接添加到单个 JComponent 会容易得多。

例子

你是怎么做的:

contSimTable.addMouseListener(new MouseAdapter() {
    public void mouseClicked(final MouseEvent event) 
    {
         //Coordinate calculation for the jlabels
    }
    });

尝试:

jlabel.addMouseListener(new MouseAdapter() {
    public void mouseClicked(final MouseEvent event) 
    {
         //Do stuff here
    }
    });
于 2013-08-26T15:09:45.687 回答
0

在评论中澄清contSimTabletarget变量是相同的JTable实例后,我认为该声明int modelColumn = target.convertColumnIndexToModel(column);似乎是您遇到的不当行为的原因。

JTable.getValueAt()方法已经在后台调用convertColumnIndexToModel(),因此您可能不应该自己调用这些方法。convertRowIndexToModel(顺便说一句,如果由于某种原因您必须手动转换为模型,您应该对行执行相同的操作吗?)。

尽管尚不清楚您要做什么,因为您的表似乎将组件存储在其模型 (a JPanel) 中而不是数据中。如果您尝试自定义单元格的显示,您应该使用TableCellRenderer,如果您想编辑单元格,您应该使用TableCellEditor其他人已经建议的 a。理想情况下,您的程序应该与TableModelonly 交互,然后通知 table 在数据更改期间重新绘制自身。

我希望这有帮助

于 2013-08-27T06:37:18.370 回答