Java 单击jtable中的超链接?
如何为Java 单击jtable中的超链接?,java,swing,url,jtable,mouse-listeners,Java,Swing,Url,Jtable,Mouse Listeners,如何为JTable中的每条记录启用超链接 我想做的是,用户可以点击超链接,然后显示他们可以编辑/更新的信息 或者,如何启用表数据的就地编辑 另一个问题是,我目前正在使用以下方式显示不同的屏幕。但这不是一种优雅的方式,我知道我们应该使用cardlayout,但具体如何操作呢 mainPanel.setVisible(false); createBlogEntryPanel.setVisible(true); setComponent(createBlogEntryPanel); 要解决使用事件的
JTable
中的每条记录启用超链接
我想做的是,用户可以点击超链接,然后显示他们可以编辑/更新的信息
或者,如何启用表数据的就地编辑
另一个问题是,我目前正在使用以下方式显示不同的屏幕。但这不是一种优雅的方式,我知道我们应该使用cardlayout,但具体如何操作呢
mainPanel.setVisible(false);
createBlogEntryPanel.setVisible(true);
setComponent(createBlogEntryPanel);
要解决使用事件的
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();
}
}
public类主框架{
公用干管(){
超级();
DefaultTableModel dt=新的DefaultTableModel(
新字符串[][{”http://google.com" }, { "http://gmail.com“},新字符串[]{”Url“});
最终JTable t=新JTable(dt);
t、 addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
int row=t.rowAtPoint(新点(e.getX(),e.getY());
int col=t.columnAtPoint(新点(e.getX(),e.getY());
系统输出打印项次(行+列+列);
字符串url=(字符串)t.getModel().getValueAt(行,列);
System.out.println(url+“被点击”);
//在此处执行您想对url执行的操作
}
@凌驾
公共无效鼠标事件(鼠标事件e){
int col=t.columnAtPoint(新点(e.getX(),e.getY());
如果(列==0){
t、 setCursor(新光标(Cursor.HAND_光标));
}
}
@凌驾
公共无效mouseExited(MouseEvent e){
int col=t.columnAtPoint(新点(e.getX(),e.getY());
如果(列!=0){
t、 setCursor(新游标(Cursor.DEFAULT_Cursor));
}
}
});
添加(新的JScrollPane(t));
t、 getColumnModel().getColumn(0).setCellRenderer(新的TableCellRenderer()){
@凌驾
公共组件GetTableCellRenderComponent(JTable表,最终对象值,布尔值arg2,
布尔值(arg3、int arg4、int arg5){
最终JLabel实验室=新JLabel(“”);
返回实验室;
}
});
设置大小(700500);
setLocationRelativeTo(空);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
}
公共静态void main(字符串[]args){
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(例外e){
e、 printStackTrace();
}
新的Main();
}
}
(这个问题太模糊了,无法简洁/完整地回答——这个答案假设主要部分是JTable中的超链接)
考虑使用一个完全支持集合组件(表、列表、树..)中的超链接的框架,比如f.i
有关SwingX中的代码示例,请参见
编辑
但如果单元格中只有一部分是超链接,或者更糟的是,如果单元格中有两个不同的链接,该怎么办 正如我在评论中提到的:这在SwingX中不受支持(它是基于细胞的) 因此,有了几个选择,一切又回到了原点 ol风格:(错误地)使用cellEditor
- 拥有一个编辑组件,该组件是/包含一个超链接
- 有一个鼠标侦听器,在滚动单元格时开始编辑
- 从现在起,live组件将处理MouseeEvents,并可在超链接上的按下/单击按钮时触发相应的操作
- 在滚动界面中添加“热点”
- 增强(或替换)rolloverProducer,以便在检测到滚动感知单元后生成更细粒度的通知
- 将鼠标位置转换为单元格(渲染组件)坐标,并查询是否对应于热点的单元格,如果(且仅当)是,启用手臂并单击触发该操作
当然,第二个可以独立于SwingX实现:一个普通的ol'自定义mouseListener和映射逻辑应该可以实现这一点(抱歉,手边没有代码)您可以使用:.setText(“”);是否要在浏览器中打开给定的url?或者别的什么?是的,我只是想给JTable添加超链接。我不想创建一个重复的问题,所以只是在这个问题上添加了悬赏。如果JXTable有效,我可以使用它;我来看看。我不完全确定没有swingx你能做到这一点,因为普通的旧JTable会消耗鼠标点击事件——它似乎不会将它们委托给子组件。然而,我可能只是做错了什么。在这两种情况下,我只是暂时忽略了更复杂的用例,使用了swingx,整个列都是可链接的。但是,如果单元格中只有一部分是超链接,或者更糟糕的是,如果一个单元格中有两个不同的链接,该怎么办?在这种情况下,您仍然可以使用swingx,如@kleopatra所述。这是一个很好的图书馆@不幸的是,javamonkey79在SwingX中不受支持(它和这个答案一样基于单元格)