Apo*_*nut 3 java swing swingx hyperlink jxtable
我的问题是如何将JXTable列(仅适用于一个/特定列)的超链接转换为我的默认桌面Web浏览器的"_blank"链接.
我使用JXTable和DefaultTableModel,我也从sqlite数据库调用数据.我在互联网,谷歌,[...]进行了研究,我发现了很多信息,如果我没有犯错:
***注意:该列每个单元只有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.
}
}
});
Run Code Online (Sandbox Code Playgroud)
编辑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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
没有涉及的监听器,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);
Run Code Online (Sandbox Code Playgroud)
请注意,该列需要不可编辑以自动支持超链接.
编辑2
如果要打开浏览器/邮件客户端,请使用配置了SwingX HyperlinkAction的HyerlinkProvider.这是由核心DesktopAction支持的.它的目标必须是URI类型,然后它会自动检测是否打开一个或另一个.
您可以按列手动安装它:
TableCellRenderer renderer = new DefaultTableRenderer(
new HyperlinkProvider(new HyperlinkAction()));
table.getColumnExt(0).setEditable(false);
table.getColumnExt(0).setCellRenderer(renderer);
Run Code Online (Sandbox Code Playgroud)
事实上,它甚至更简单: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);
}
}
Run Code Online (Sandbox Code Playgroud)
为了看到支持在行动 - 对于JXList/JXTree来说是相同的 - 运行SwingLabs网络演示:示例在几个页面上,fi JXTable,Hyperlink/extended,Highlighter并浏览它附带的代码