Java Swing应用程序JLable超链接

时间:2022-06-25 18:14:44

在HTML中设置一个超链接是很容易的,使用<a></a>标签就可以完成了。

在客户端应用程序中,并没有这样的标签,但是可以使用按钮来实现,But 有时候就是想好看一点,不想要按钮,只想要个超连接,所以需要自定义这样的一个标签。

那就拿JLable来实现吧:

对于一个超链接来说,需要有链接地址和描述文字,那就直接上代码

首先创建一个LinkLable类,继承JLable,该类应该有如下属性:

public class LinkLabel extends JLabel {
private String text;// 超链接文本
private URL url;// 链接
private Color color = Color.BLUE;// 链接颜色
     public LinkLabel(String text, String url) {
          super("<html>" + text + "</html>");
          this.text = text;
          this.setForeground(Color.BLUE);
          if (!url.startsWith("http://")) {
              url = "http://" + url;
          }
          try {
              this.url = new URL(url);
          } catch (MalformedURLException e) {
              e.printStackTrace();
          }
        // 设置鼠标事件
          this.addMouseListener(new MouseAdapter() {
              @Override
              public void mouseClicked(MouseEvent e) {
                  try {
                      Desktop.getDesktop().browse(LinkLabel.this.url.toURI());//最重要的是这句话,这句话是对点击标签进行web请求的关键
                  } catch (IOException e1) {
                      e1.printStackTrace();
                  } catch (URISyntaxException e1) {
                      e1.printStackTrace();
                  };
              }
       //设置鼠标进入事件,这里只是设置了颜色
              @Override
              public void mouseEntered(MouseEvent e) {
                  LinkLabel.this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
                  color = LinkLabel.this.getForeground();
                  LinkLabel.this.setForeground(Color.RED);
                  LinkLabel.this.setText("<html>" + LinkLabel.this.text + "</html>");
              }               @Override
              public void mouseExited(MouseEvent e) {
                  LinkLabel.this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                  if (color != null) {
                      LinkLabel.this.setForeground(color);
                  }
                  LinkLabel.this.setText("<html>" + LinkLabel.this.text + "</html>");
              }
          });
      }
  }

上述代码实现了进行web访问LinkLable,那么有时候不是访问web页面,只是应用程序呢?

其实很简单,只需要改变鼠标点击事件mouseClicked方法的实现就好了,

String url = LocalLinkLabel.this.url;
if("register".equals(url)){
System.out.println("here");
((JFrame)LocalLinkLabel.this.getParent().getParent()
.getParent().getParent().getParent()).dispose();
new RegisterFrame();
}

看到这么多getParent()方法是不是很疑惑?其实只不过是找到该窗体可通过System.out.print(this.getParent())直到找到待关闭的窗体即可;