首页 > 解决方案 > 如何用鼠标选择 JTable 的列名

问题描述

我创建了一个查询执行器,并使用了一个基于 resultSet 的 JTable 来显示结果。我的 Jtable 实现是这样的:

        ResultSetMetaData metaData = rs.getMetaData();
        columnCount = metaData.getColumnCount();
        Vector<String> columnNames = new Vector<String>();

        for (int i = 1; i <= columnCount; i++) {
            columnNames.add(metaData.getColumnName(i));

        }

        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        while (rs.next()) {
            Vector<Object> vector = new Vector<Object>();
            for (int i = 1; i <= columnCount; i++) {
                vector.add(rs.getObject(i));
            }
            data.add(vector);

        }
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        model.fireTableStructureChanged();

        tableSwing.setModel(model);

除了一件事,一切都很好。我无法选择或复制列名。你能给我推荐一个解决方案吗?

标签: javajtable

解决方案


这与您的代码无关,它工作得很好。你的问题是 JTable 默认没有这个功能。您将需要实现一个 JTableHeader 鼠标侦听器,该侦听器检测用户何时单击表头。

一个例子:

JTableHeader header = table.getTableHeader();
header.setReorderingAllowed(false);
header.addMouseListener(new MouseAdapter() {  
    public void mouseClicked(MouseEvent e) {  
         int col = header.columnAtPoint(e.getPoint());  
         StringSelection selection = new StringSelection(table.getColumnName(col));
         Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
         clipboard.setContents(selection, selection);
       }  
   }); 

请注意,这将不允许用户选择或复制列名,因为 Swing 不允许这样做(列名未以允许的方式呈现)。

我在示例中所做的是使代码自动将列名复制到剪贴板。不是一个完美的解决方案,但它会起作用。


推荐阅读