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

时间:2012-02-10 20:22:57

标签: 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);
    }
}

编辑:我知道我可能只是将鼠标滑块添加到滚动窗格或面板,以便在我点击它们时清除表格选择。我只是想知道是否有一个更好/更清洁的解决方案,以确保当我点击它的界限时清除JTable选择。

3 个答案:

答案 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