5

这是我在名为 Test2 的项目中名为 test2 的包中名为 Test2.java 的文件中的代码;

package test2;

import javax.swing.JFrame;

public class Test2 {
    public static void main(String[] args) {
    JFrame mainWindow = new HtmlWindow("<html>"
            + "<a href=\"http://stackoverflow.com\">"
            + "blah</a></html>");
        mainWindow.setVisible(true);
    }
}

在同一个包中,我在一个名为 HtmlWindow.java 的文件中有此代码;

package test2;

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;


class HtmlWindow extends JFrame {
    public HtmlWindow(String refreshGrid) {
        super("blah");
        setSize(300, 100);
        Container content = getContentPane();
        String labelText = refreshGrid;
        JLabel coloredLabel = new JLabel (labelText, JLabel.CENTER); 
        content.add(coloredLabel, BorderLayout.NORTH);

    }

}

当我运行该项目时,我会在预期的位置看到一个带有“blah”一词的窗口,带有蓝色和下划线,但是当我将鼠标悬停在该单词上时光标不会改变,当我单击它时也不会发生任何事情。

我的问题如下;

  • 是否可以在 jLabels 中放置超链接?
  • 如果是这样,是我做错了什么,还是程序运行不正常?
  • 如果没有,有什么好的选择?我不使用 JButtons 的原因是,最终我想创建一个包含任意数量超链接的网格,并且我希望超链接是图像,虽然 JButtons 可以在它们上面有图像,但我不希望超链接看起来像“按钮”。我想我可以使用不可编辑的 JEditorPane 吗?
4

2 回答 2

4

Swing 不是一个功能齐全的浏览器。它支持包含链接的简单 HTML,但不会自动更改光标样式。据我所知,您必须以编程方式执行此操作,即将鼠标侦听器添加到您的标签并在鼠标悬停在标签上时更改光标样式。显然,您可以编写自己的类LinkLabel来实现此逻辑,然后在每次需要时使用它。

于 2012-07-26T12:50:08.393 回答
3

似乎仅仅通过一个超链接,您就可以获得您通常的网络浏览器行为。根据网上的例子,通常做的是实现一个ActionListeneron the JLabeland call Desktop.getDesktop().browse(new URI("..."));

此调用的问题在于它似乎不适用于所有操作系统。你可以做的是看看你是否可以从命令行在浏览器中打开链接,如果你能做到这一点,你应该能够通过使用类中的exec方法来做你需要的事情Process。但是,这很可能取决于平台。

话虽如此,我认为应该使用标签来描述文本(尽管我认为在看到链接时,用户就知道会发生什么,所以我认为在这种情况下,我们可以将其称为一个例外)。如果您想拥有一个触发和操作的组件,您可以使用 aJButton代替。

于 2012-07-26T12:55:45.490 回答