2011-05-13 22 views
0

私はハイパーリンクとしてJLabelsを使用しています。私はそれらを見て、ブラウザーのリンクのように正確に機能させるため、テキストペイン/エディターペインなどを使用することは望ましくありません。問題は、これらのリンクが配置されるコンテナの多くは、サイズが指定されていないことです。親のサイズ(または祖父母)に依存します。私はレイアウト用のボックスを使用しています。リンクテキストがボックスの幅の約2/3以上に及ぶ場合、ボックスの内容はボックスの実際の範囲外に伸び始めます(したがって、ボックスがJScrollPane水平スクロールバーが表示されます)。優先/最大/最小サイズのテキストラッピングJLabels

JLabelで折り返しを適用する方法はありますか?私が読んだ多くの記事では、HTMLタグのテキストをputtngすると、必要に応じて自動的に折り返されますが、何をしても動作させることはできません。彼らは行くだろう場所を正確に私は知らないので、私は
タグを使用することはできません(これは自動化することができない限り、 - すなわち

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()メソッドで遊んで、あなたのレイアウトマネージャが尊重しているものを見つける必要があります。

推奨幅を取得するには、親の1つから幅を取得する必要があります。もう一度、レイアウトマネージャに応じて、適切な幅、最大幅、またはgetSize()。getWidth()を取得する必要があります。レイアウトの詳細がわからないと、正確にこれを行う必要があると言うことは難しいですが、ラップするためにラベルに何らかの幅を設定する必要があります。その周りには方法はありません。

私が考えることができる唯一の他の選択肢は、ラベルの優先幅を、利用可能なスペースに常に収まるように任意のものに設定することです。

1

JTextAreaを使用します。テキストは自動的に折り返すように設定できます。テキスト領域のプロパティで再生して、ラベルのように見せることができます。

カスタムのハイライターを使用してテキストに「下線」を付けることができます。次に、必要に応じてハイライトを追加/削除します。 Rectangle Painterから始めることができます。

関連する問題