3

我的问题是如何将 JXTable 列(仅针对一个/特定列)的超链接设置为我的默认桌面 Web 浏览器的“_blank”链接之类的操作。

我使用 JXTable 和 DefaultTableModel,也从 sqlite 数据库中调用数据。我在互联网、谷歌、[...] 上进行了研究,发现很多信息说,如果我没有弄错:

  • 将 MouseListener 注册到 JXTable;
  • 从 MouseEvent 生成点对象;
  • 通过 getValueAt 获取文本

***注意:该列每个单元格只有 1 个链接,没有任何文字,只有链接。

现在我已经实现了这个代码来做一个双击单元格的动作。请有人可以帮助我实现在默认浏览器中打开的列超链接,就像在这个例子中一样(但我不知道如何适应,因为数据不是从数据库中调用的)。

Table_Employee.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
      if (e.getClickCount() == 2) {
         JXTable target = (JXTable)e.getSource();
         int row = target.getSelectedRow();
         int column = target.getSelectedColumn();
           JFrame newFrame = new JFrame();               //I want to open an distinc link
               newFrame.setTitle("Detail Screen");       //for every cell along one column
               newFrame.setVisible(true);                //in the web browser, not a frame.
         }
   }
});

编辑 1 @Kleopatra 的编辑 2 中的代码对我的应用程序有一些问题。另外,我又尝试了下面的代码,瞧——当第一次点击时,链接就在那里,但没有反应(没有打开浏览器)。@Kleopatra,您能否向我提供有关您的建议的更多信息,因为当我尝试放置该代码时,IDE 无法识别hyperlinkColumn

Table_Employee.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
      if (e.getClickCount() == 1) {
         JXTable target = (JXTable)e.getSource();
         int row = target.getSelectedRow();
         int column = target.getSelectedColumn();
         AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) {

                public void actionPerformed(ActionEvent e) {
                //open the browser event?
                }
         };

    TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(simpleAction));
        Table_Employee.getColumnExt(2).setEditable(false);
        Table_Employee.getColumnExt(2).setCellRenderer(renderer);
      }
   }
});
4

1 回答 1

7

不涉及侦听器,SwingX 有一个 HyperlinkProvider,您只需根据需要配置一个操作:

JXTable table = new JXTable(myModel);
AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) {

    public void actionPerformed(ActionEvent e) {
        // here goes what you want to do on activating the hyperlink
        //LOG.info("hit: " + getTarget());
    }

};
TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(simpleAction));
table.getColumnExt(0).setEditable(false);
table.getColumnExt(0).setCellRenderer(renderer);

请注意,该列需要不可编辑才能自动支持超链接。

编辑 2

如果要打开浏览器/邮件客户端,请使用配置有 SwingX HyperlinkAction 的 HyerlinkProvider。这是由核心 DesktopAction 支持的。它的目标必须是 URI 类型,然后它会自动检测是否打开一个或另一个。

您可以按列手动安装它:

TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(new HyperlinkAction()));
table.getColumnExt(0).setEditable(false);
table.getColumnExt(0).setCellRenderer(renderer);

事实上,它甚至更简单:JXTable 已经将它作为 URI 类的默认值。您所要做的就是实现您的模型,使其包含 uris 并报告它作为它的列类:

DefaultTableModel model = new DefaultTableModel(...) {

     @Override
     Class<?> getColumnClass(int column) {
         if (column == hyperlinkColumn) {
             return URI.class;
         } 
         ... // handle other columns
         return super.getColumnClass(column);
     }

     @Override
     boolean isCellEditable(int row, int column) {
         if (column == hyperlinkColumn) {
            return false; 
         }
         ... // handle other columns
         return super.isCellEditable(row, column); 
     }
}

要查看实际支持 - JXList/JXTree 也是如此 - 运行SwingLabs 网络演示:示例位于多个页面上,包括 JXTable、超链接/扩展、荧光笔并浏览随附的代码

于 2012-08-02T15:46:44.433 回答