2011-05-13 51 views
0

我使用JLabels作为超链接。我希望他们看起来和浏览器中的链接完全一样,所以使用文本窗格/编辑器窗格等是不可取的。问题是许多这些链接将被放置的容器没有规定的大小:它们依赖于父母(甚至是祖父母)的大小。我使用Boxes进行布局,如果链接文本跨越盒子宽度的三分之二以上,则盒子内容开始伸展到盒子的实际边界之外(因此,如果该盒子被JScrollPane包围,会出现一个水平滚动条)。无首选/最大/最小大小的文本包装JLabels

有什么办法强制JLabel上的包装?我读过的很多帖子都说,将文本放在HTML标签中会导致它在必要时自动换行 - 但无论我做什么,我都无法使其工作。我不能使用
标签,因为我不知道究竟在何处,他们会去(除非可以自动化 - 即

if(text.length() > wrapLength) 
{ 
    //break the text into substrings and insert a <br /> at wrapLength 
    //the difficulty is in figuring out the value of wrapLength 
} 

任何想法,将不胜感激。超链接类的代码如下。

import java.awt.Color; 
import java.awt.Desktop; 
import java.awt.Font; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.io.IOException; 
import java.net.URI; 
import java.net.URISyntaxException; 
import javax.swing.JLabel; 

public class Hyperlink extends JLabel 
{ 
    private URI uri; 
    private String baseText; 

    public Hyperlink(String text, String uri, Font font, Color textColor) 
    { 
     super(text); 
     baseText = text; 
     setFont(font); 
     setForeground(textColor); 
     setOpaque(false); 

     if(Desktop.isDesktopSupported()) 
     { 
      try 
      { 
       setToolTipText(uri); 
       this.uri = new URI(uri); 
       addMouseListener(new LinkMouseListener()); 
      } 
      catch(URISyntaxException ex) 
      { 
      } 
     } 
    } 

    private class LinkMouseListener extends MouseAdapter 
    { 
     @Override 
     public void mouseClicked(MouseEvent e) 
     { 
      Desktop desktop = Desktop.getDesktop(); 
      try 
      { 
       desktop.browse(uri); 
      } 
      catch(IOException ioe) 
      { 
       System.out.println("Something went wrong..."); //DELETE 
      } 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) 
     { 
      setText("<html><u>" + baseText + "</u></html>"); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) 
     { 
      setText(baseText); 
     } 
    } 
} 

回答

2

在标签上,尝试setPreferredSize(new Dimension(width, height))setSize(new Dimension(width, height))setMaximumSize(new Dimension(width, height))和宽度设置为你希望它来包装的宽度。我认为你的情况将会是setMaximumSize(...)。

由于您的布局管理器,它不会自动换行。一些版面管理者会忽略首选尺寸或其他尺寸。在你的情况中,你可能只需要使用不同的setXXXSize()方法,并找到布局管理器所尊重的方法。

要获得首选的宽度,您将不得不从父母之一获取宽度。再次,取决于布局管理器,您可能必须获取首选宽度,最大宽度或getSize()。getWidth()。在不了解布局的更多信息的情况下,很难说您需要如何做到这一点,但您确实需要在标签上设置某种宽度才能包裹 - 这是无法实现的。

我能想到的唯一的其他选择是将标签上的首选宽度设置为任意的,你知道应该始终适合可用空间。

1

使用JTextArea。文本可以设置为自动换行。您可以使用文本区域属性来使它看起来像一个标签。

您可以使用自定义荧光笔来“加下划线”文本。然后根据需要添加/删除荧光笔。 Rectangle Painter可以让你开始。