JComponent包含的方法在JTable的MouseEvent操作中不起作用

时间:2013-08-26 14:54:48

标签: java swing jtable mouseevent

我在JTable中有一个单元格,其中JPanel位于其中。 JPanel里面有2个标签。单击左侧标签时我想做不同的动作,我想在点击右侧动作时再做一次操作。我不想使用TableCellEditor,这使我的代码变得如此复杂。我的单元格值有一系列类型。

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

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;
                    }

                }

            }
        }
    }
});

3 个答案:

答案 0 :(得分:2)

TableCellEditor是正确的做法。有许多方法可以解决不同的数据类型:

  • 默认情况下,正如here所述。

  • TableColumn,如图所示here

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

  • 重写getCellEditor(),如图here所示。

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

答案 1 :(得分: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
    }
    });

答案 2 :(得分:0)

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

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

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

我希望这会有所帮助