我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我知道我可能只是将一个mouselistener添加到滚动窗格或面板,以便在我点击它们时清除表格选择.我只是想知道是否有一个更好/更清洁的解决方案,以确保当我点击它的界限时,JTable选择被清除.
调查使用focus listener(table.addFocusListener( ... );)来查找表/单元格何时不再具有焦点,以及何时调用大小写: table.getSelectionModel().clearSelection();