Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单击jtable中的超链接?_Java_Swing_Url_Jtable_Mouse Listeners - Fatal编程技术网

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,并可在超链接上的按下/单击按钮时触发相应的操作
扩展SwingX风格:丰富滚动界面(孵化器可能有示例,但由于尚未准备就绪,没有添加到核心SwingX中:-)基本思想是

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

当然,第二个可以独立于SwingX实现:一个普通的ol'自定义mouseListener和映射逻辑应该可以实现这一点(抱歉,手边没有代码)

您可以使用:.setText(“”);是否要在浏览器中打开给定的url?或者别的什么?是的,我只是想给JTable添加超链接。我不想创建一个重复的问题,所以只是在这个问题上添加了悬赏。如果JXTable有效,我可以使用它;我来看看。我不完全确定没有swingx你能做到这一点,因为普通的旧JTable会消耗鼠标点击事件——它似乎不会将它们委托给子组件。然而,我可能只是做错了什么。在这两种情况下,我只是暂时忽略了更复杂的用例,使用了swingx,整个列都是可链接的。但是,如果单元格中只有一部分是超链接,或者更糟糕的是,如果一个单元格中有两个不同的链接,该怎么办?在这种情况下,您仍然可以使用swingx,如@kleopatra所述。这是一个很好的图书馆@不幸的是,javamonkey79在SwingX中不受支持(它和这个答案一样基于单元格)