【问题标题】:Click hyperlink in jtable?点击jtable中的超链接?
【发布时间】:2010-11-23 13:53:41
【问题描述】:

如何为JTable 中的每条记录启用超链接?

我想要做的是,用户可以点击超链接,然后显示他们可以编辑/更新的信息。

另外,如何启用表格数据的就地编辑?

另一个问题是我目前正在使用以下方式显示不同的屏幕。但这不是一种优雅的方式,我知道我们应该使用卡片布局,但具体该怎么做呢?

mainPanel.setVisible(false);
createBlogEntryPanel.setVisible(true);
setComponent(createBlogEntryPanel);

【问题讨论】:

  • 你可以试试:.setText("关于");
  • 你想在浏览器中打开给定的网址吗?还是别的什么?

标签: java swing url jtable mouse-listeners


【解决方案1】:

要解决JTable 使用事件的问题,您可以将自己的MouseListener(或MouseAdapter)添加到JTable,并在此侦听器中进行操作。以下是您可以实现的示例:

public class Main extends JFrame {

public Main() {
    super();

    DefaultTableModel dt = new DefaultTableModel(
            new String[][] { { "http://google.com" }, { "http://gmail.com" } }, new String[] { "Url" });
    final JTable t = new JTable(dt);

    t.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            int row = t.rowAtPoint(new Point(e.getX(), e.getY()));
            int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
            System.out.println(row + " " + col);

            String url = (String) t.getModel().getValueAt(row, col);
            System.out.println(url + " was clicked");
            // DO here what you want to do with your url
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
            if (col == 0) {
                t.setCursor(new Cursor(Cursor.HAND_CURSOR));
            }
        }

        @Override
        public void mouseExited(MouseEvent e) {
            int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
            if (col != 0) {
                t.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
        }
    });

    add(new JScrollPane(t));

    t.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {

        @Override
        public Component getTableCellRendererComponent(JTable table, final Object value, boolean arg2,
                boolean arg3, int arg4, int arg5) {
            final JLabel lab = new JLabel("<html><a href=\"" + value + "\">" + value + "</a>");
            return lab;
        }
    });

    setSize(700, 500);
    setLocationRelativeTo(null);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }

    new Main();
}

}

【讨论】:

  • 但是如果单元格只有一部分是超链接,或者更糟糕的是,如果一个单元格中有 2 个不同的链接呢?
  • 在这种情况下,您仍然可以像@kleopatra 提到的那样使用 SwingX。这是一个非常好的图书馆!
  • @javamonkey79 不幸的是,SwingX 不支持(它是基于单元格的,就像这个答案一样)
【解决方案2】:

(这个问题太模糊了,无法简洁/完整地回答——这个答案假设主要部分是 JTable 中的超链接

考虑使用完全支持集合组件(表、列表、树..)中的超链接的框架 - 例如 f.i. SwingX

有关 SwingX 中的代码示例,请参阅 recent answer

编辑

但是如果只有部分单元格是超链接,或者更糟糕的是,如果一个单元格中有 2 个不同的链接呢?

正如我在评论中提到的:SwingX 不支持这一点(它是基于单元格的)。

所以还是回到原点,有几个选项

ol' 风格:(错误)使用 cellEditor

  • 有一个编辑组件,它是/包含一个超链接
  • 有一个 mouseListener 在鼠标悬停时开始编辑
  • 从现在开始,live-component 会处理 mouseEvents,并可以在超链接/s 处按下/单击时触发相应的操作

扩展 SwingX 风格:丰富翻转界面(孵化器可能有示例,但由于尚未准备好,没有添加到核心 SwingX 中:-) 基本思想是

  • 在翻转界面添加“热点”
  • 增强(或替换)rolloverProducer 以在检测到翻转感知单元后生成更细粒度的通知
  • 将 mousePosition 转换为单元格(渲染组件)坐标并查询该单元格是否对应于热点,如果(且仅当)如此,则启用并单击触发操作

当然,第二个可以独立于 SwingX 实现:一个普通的自定义 mouseListener 和映射逻辑应该可以解决问题(抱歉,手头没有代码)

【讨论】:

  • 是的,我只是想将超链接添加到 JTable。我没有创建重复的问题,所以只是为这个问题添加了赏金。如果它有效,我可以使用 JXTable;我去看看。
  • 我不完全确定你可以在没有 swingx 的情况下做到这一点,因为普通的旧 JTable 会消耗鼠标点击事件——它似乎没有将它们委托给子组件。但是,我可能只是做错了什么。在任何一种情况下,我都暂时忽略了更复杂的用例,并使用了 swingx,整个列都是可链接的。
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2018-11-07
  • 2016-04-20
  • 2020-12-04
相关资源
最近更新 更多