2011-05-13 48 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可以讓你開始。