单击表格右侧时如何清除表格选择

ete*_*00b 4 java swing focus

我有一个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选择被清除.

cdc*_*cdc 6

调查使用focus listener(table.addFocusListener( ... );)来查找表/单元格何时不再具有焦点,以及何时调用大小写: table.getSelectionModel().clearSelection();