我有一个JTable,它存放在一个滚动窗格中,而滚动窗格又位于一个嵌入JFrame的面板中。如果扩展了JFrame,那么下面和JTable的右边都有空格。
如果用户在表格下方,表格下方或表格右侧点击,我想清除表格上的选择。
为了在用户点击表格时清除选择,我将表格配置为填充滚动窗格视口的高度,并在表格中添加了一个MouseListener,这样当用户点击表格下方时,“rowAtPoint” “返回-1,然后我清除选择。但是,这不适用于表格的RHS。该表甚至没有收到这些鼠标事件。我应该如何检测JTable右侧的点击并清除表格上的选择?见下面的代码。请注意,我并不打算让代码变得漂亮,并以“正确的方式”做事。我的重点只是创建一个说明问题的SSCCE。 :)
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class TableTest {
public static void main(String args[]) {
JFrame f = new JFrame();
JPanel p = new JPanel(new BorderLayout());
JScrollPane sp = new JScrollPane();
final JTable t = new JTable(5,5);
t.setFillsViewportHeight(true);
t.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for(int i = 0; i < 5; i++) {
t.getColumnModel().getColumn(i).setWidth(50);
t.getColumnModel().getColumn(i).setMaxWidth(75);
}
t.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int row = t.rowAtPoint(e.getPoint());
if(row == -1) {
t.clearSelection();
}
}
});
sp.getViewport().add(t);
p.add(sp, BorderLayout.CENTER);
f.add(p);
f.pack();
f.setVisible(true);
}
}
编辑:我知道我可能只是将鼠标滑块添加到滚动窗格或面板,以便在我点击它们时清除表格选择。我只是想知道是否有一个更好/更清洁的解决方案,以确保当我点击它的界限时清除JTable选择。
答案 0 :(得分:6)
调查使用焦点监听器(table.addFocusListener( ... );
)来找出表格/单元格何时不再具有焦点,以及何时是案例调用:table.getSelectionModel().clearSelection();
答案 1 :(得分:2)
您可以尝试添加如下所示的全局鼠标侦听器:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener(){
@Override
public void eventDispatched(AWTEvent event) {
if(event.getID() == MouseEvent.MOUSE_CLICKED) {
MouseEvent mevent = (MouseEvent) event;
int row = t.rowAtPoint(mevent.getPoint());
if(row == -1) {
t.clearSelection();
}
}
}
}, AWTEvent.MOUSE_EVENT_MASK);
答案 2 :(得分:0)
您可以使用FocusListener。
当桌子失去焦点时,您可以清除选择。
http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/FocusListener.html