如何检测JTable行边界上的点击?

时间:2012-02-04 18:31:26

标签: java swing jtable

我的应用程序中有一个JTable。我在桌面上设置了一个自定义渲染器(一个JTextArea,启用了换行),允许多行内容。在某些情况下,期望JTable单元的内容溢出单元的边界。我想做以下事情:

我没有让用户拖动行边框来调整单元格的大小,而是希望用户能够双击行边框,所以当我检测到这一点时,我可以自动调整单元格的高度(高度为行)显示单元格的全部内容。

我的问题是,检测行边框双击的最佳方法是什么?我已经通过使用mouseClicked方法在JTable上设置MouseListener来实现这一点,如下所示:

public class MouseButtonInputListener extends MouseInputAdapter
{
    private JTable fTable;

    public MouseButtonInputListener(JTable parentTable)
    {
       fTable = parentTable;
    } 

    @Override
    public void mouseClicked(MouseEvent e)
    {

        // Some pre-processing here...

        if(e.getClickCount() == 2 && 
           fTable.getCursor().getType() == Cursor.N_RESIZE_CURSOR)
        {
            // Auto-adjust row height to fit contents...            
        }

    }
}

虽然这有效,但我对这条线路并不满意:

fTable.getCursor().getType() == Cursor.N_RESIZE_CURSOR

有关更好方法的建议吗?以上是所有平台上的可靠方法吗?

1 个答案:

答案 0 :(得分:2)

在线搜索后,我找到了以下页面:

http://java.sun.com/products/jlf/ed2/book/HIG.Behavior.html

除其他外,它指定在不同情况下的鼠标光标行为。根据“指针反馈”部分,光标在N_RESIZE_CURSOR和S_RESIZE_CURSOR之间切换,具体取决于它是否是悬停在其上的组件的上边界或下边界。有趣的是,在3个平台中的2个(Mac和Windows)中,这些游标完全相同。无论如何,我的代码应该如下:

@Override
public void mouseClicked(MouseEvent e)
{
    // Some pre-processing here. Determine row at mouse click location
    int cursorType = fTable.getCursor().getType();
    if(e.getClickCount == 2 && 
      (cursorType == Cursor.N_RESIZE_CURSOR || cursorType == CURSOR.S_RESIZE_CURSOR))
    {
        // Resize row appropriately.
    }
}

这适用于所有平台。感谢大家的意见和建议。