2017-06-14 81 views
0

我得到我的周围JTable头此刻然而这两次现在我有这种类型的问题,我认为这是错误的我的方法,损坏的行和列时,拖动鼠标

我有一个JTabbedPane将三个选项卡设置为表格,我运行测试以查看选定选项卡的检测是否有效,以及是否成功获取行信息和列信息。

我在这三张牌桌上增加了一张MouseListener,通过抓取该事件的getRow()getColumn(),可靠地产生了良好的结果!然而,这并不能产生可靠的结果,因为我现在发现,如果我点击一行,按住鼠标按钮并拖动到另一行,然后释放getRowgetColumn将使单元格单击,但突出显示的行将是我发布!

public void detectMouseClickRow(JTable aTabbedPane) { 
     aCol = aTabbedPane.getSelectedColumn(); 
     aRow = aTabbedPane.getSelectedRow(); 
     valueAt = (String)aTabbedPane.getValueAt(aRow, aCol); 
} 

如何获取突出显示的行的行和列信息?否则,当有人来点击一个工作来删除,他们可以选择错误的?

+0

'getSelectedRow/Column'是在返回选择的“分”点所选的范围。基于“最小”的测试,似乎没有任何直接的方法来确定鼠标从哪个细胞释放出来 – MadProgrammer

回答

2

根据我有限的测试,唯一的“貌似”可靠的方式来获得选择的起点,就是用行和列直接... ListSelectionModel

DefaultTableModel model = new DefaultTableModel(10, 10); 
JTable table = new JTable(model); 
ListSelectionListener listener = new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting()) { 
      return; 
     } 
     int row = table.getSelectionModel().getAnchorSelectionIndex(); 
     int col = table.getColumnModel().getSelectionModel().getAnchorSelectionIndex(); 

     System.out.println(row + "x" + col); 
    } 
}; 

table.getSelectionModel().addListSelectionListener(listener); 
table.getColumnModel().getSelectionModel().addListSelectionListener(listener); 

现在,这个例子是通过ListSelectionListenerListSelectionModel交互验证这个想法,但你可以很轻松地将这个想法到您的MouseListener并提取选择anchor指数有

+0

这似乎有点复杂,我认为这是一个常见的要求 - 或者我在这里错过了一些东西。也许我可以使用X,Y合作社,然后减去父母x,y。 。 。 。明白了吗? 这是行/列表格布局的'首选'方法吗? 我可以通过控制HIGHLIGHT并强制它停留在table.getRow()和table.getColumn()结果上吗? – JackDaw

+0

很多都归结于你可能认为的“共同需求” - 因为“MouseListener”的工作方式,你不会得到'mouseClicked'事件,只会发生'mouseReleased'事件。当JTable基于设计者的选择调用getSelectedRow/Column时,“JTable”API会“尽力”猜测应该返回的内容(只是返回最小的选定值)。 'ListSelectionModel'确实提供了一些功能('anchor'和'lead')。这是20多年以来的工作方式,所以我不确定我是否真的看到了你的观点。 – MadProgrammer

+0

@JackDaw您可以使用鼠标的x/y点来计算发生'MouseReleased'事件的单元格,但是您必须先测试它是否确实在单元格的选定范围内。你能控制亮点吗?那么,你想为行和列实现你自己的'ListSelectionModel'? – MadProgrammer