2017-10-03 10 views
1

多色のJLabelを作成するには別の方法が必要です。 (多色=異なる前景色のテキストの部分)多色のJLabel

これまでに私が見つけた唯一の解決策は、テキストをhtmlに設定することです。しかし、私はそれに問題があります...

JLabelで平滑なテキストを使ってJLabelを絞り込む必要があるとLayoutManagerが判断した場合、そのテキストは切り取られ、「...」が追加されます。 (例: "My Long Text" - > "My Long T ..."になります)

HTMLはJLabelの中で、スペース文字のどこかにラップされ、残りの部分は描画可能ですJLabelの高さは変更されていないため、表示されません。 (例:「My Long Text」 - >「My Long」になります)

私の場合、JLabelはJTableにレンダリングされます。JTableは、異なるスクリーン解像度で言えば、ユーザーによってサイズが変更されます。

htmlに「nowrap」属性またはタグを追加しようとしましたが、これは無視されます。

私を残して - 私は考えて - 一つの解決策:ラベル自分自身を描く。 そうでしょうか? 提案がありますか? 例?

ありがとうございます。第二のJLabelのテキストこと

...水平にこのパネルのサイズを変更してみてください、との両方のJLabelのの内のテキストで何が起こるか見て(ユーザーのための兆候はありません、:

はここで非常に簡単な例ですこの例では、JLabelの高さは変更されていますが、フレームワークのJTable内でレンダリングすると、行の高さは変更されず、変更したくありません。 JLabelでHTMLテキストを使用している場合、HTMLを使用せずに、それは、行の折り返しを防止するためには...どちらか

import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class MultiJLabel extends JFrame { public MultiJLabel() { super("Multi-colored JLabel test"); JPanel pnl = new JPanel(); pnl.setLayout(new BorderLayout()); pnl.add(new JLabel("This is a test of My Long Text"), BorderLayout.NORTH); pnl.add(new JLabel("<html>This is a test of <font color='#ffbebe'>My Long Text</font></html>"), BorderLayout.SOUTH); this.getContentPane().add(pnl); this.pack(); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); } public static void main(String[] args) { new MultiJLabel(); } }

Here's a picture of the original problem, where our users are not aware that the client's Order Number is not what the grid is showing, because this column has HTML-formatted text to show multi-colors.

+0

あなたは[MCVE]を示すことができました。 HTMLは間違いなく最も簡単です。ここでは、問題はマルチカラーではなくラップされたテキストについてです。まず、あなたのテキストが長すぎる場合、あなたは何を期待していますか? – AxelH

+1

@all私は再オープンを票決しました。複製はJList内の 'JLabel'に関するものです。これはSAME'JLabel'内部で色が違うという点で異なります。ここで隠された質問があることに注意してください。「HTMLが解決策なら、ラップを適切に動作させる方法は?」 – AxelH

+0

@AxelHお返事ありがとうございます。最初の質問を最小限の例で編集しました(元の問題が大きなフレームワーク内で発生したため)。私が期待しているのは、表示されたテキストが完全ではないことをユーザーに伝える何らかの表示です。 – c00lstef

答えて

0

を高さを変更しないnobr(無休憩でテキストを折り返します)タグ:

new JLabel("<html><nobr>This is a test of <font color='#ffbebe'>My Long Text</font></nobr></html>") 

nobr - タグを使用して、行はラップされませんが、それは同様に切り捨てられません。したがって、示されたテキストの末尾に省略記号(...)はありませんが、それは単なる切り詰めになります。

省略記号によって失われた追加の幅がなく、したがってより多くのコンテンツが表示されるため、欠落した...がテーブル内で実際に役立つかもしれません。しかし、ユーザーがいなくても、それがないとコンテンツが増えることはあまり明白ではないかもしれません。

+0

あなたは、すべてのコンテンツを表示することができない場合、ツールチップにセルの完全な内容を表示させるべきです、私は...すべてが表示されているかどうかを知ることをお勧めします –

0

ご意見ありがとうございましたが、私は辛抱強く自分のJLabelを作成しました。 私はそれがプログラムの悪いバージョンかもしれないことは知っているが、それは私のために働く... あなたがして上記の例を変更することによってそれをテストすることができます

JMultiColorLabel lbl = new JMultiColorLabel("This is a test of My Long Text"); 
lbl.setColors(new int[]{10,15}, new Color[]{Color.RED,Color.BLUE}); 
lbl.setPreferredSize(new Dimension(200,20)); 
pnl.add(lbl, BorderLayout.SOUTH); 

そして、このクラスを使用します。

import java.awt.Color; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.util.HashMap; 

import javax.swing.JLabel; 

public class JMultiColorLabel 
    extends JLabel 
    { 
    private static final String    STRING_OVERFLOW  = "..."; 

    private HashMap<Integer, Color>  extraColors    = new HashMap<Integer, Color>(); 

    public JMultiColorLabel(String text) 
     { 
     super(text); 
     } 

    public void setColors(int[] indices, Color[] colors) 
     { 
     for (int i = 0; i < indices.length; i++) 
      this.extraColors.put(indices[i], colors[i]); 
     } 

    protected void paintComponent(Graphics g) 
     { 
     // Get text-contents of Label 
     String text = this.getText(); 

     // No text in the JLabel? -> No risk: super 
     if (text == null || text.length() == 0) 
      { 
      super.paintComponent(g); 
      return; 
      } 

     // Content Array of characters to paint 
     char[] chars = text.toCharArray(); 

     // Draw nice and smooth 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

     // Draw background 
     if (this.isOpaque()) 
      { 
      g2d.setColor(this.getBackground()); 
      g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); 
      } 

     // FontMetrics to calculate widths and height 
     FontMetrics fm = g2d.getFontMetrics(); 

     // Available space 
     Insets ins = this.getInsets(); 
     int maxSpace = this.getWidth()-(ins.left+ins.right); 
     boolean overflow = (fm.stringWidth(text) > maxSpace); 

     // Starting offset 
     int offset = ins.left+1; 

     // The start Color is the default 
     g2d.setColor(this.getForeground()); 

     // Loop over characters 
     for (int i = 0; i < chars.length; i++) 
      { 
       // Switch Color? 
      if (this.extraColors.containsKey(i)) 
       g2d.setColor(this.extraColors.get(i)); 

       // Check if we still have enough room for this character 
      if (overflow && offset >= (maxSpace-fm.stringWidth(STRING_OVERFLOW))) 
       { // Draw overflow and stop painting 
       g2d.drawString(STRING_OVERFLOW, offset, (fm.getHeight()+ins.top)); 
       return; 
       } 
      else // We have the space -> Draw the character 
       g2d.drawString(String.valueOf(chars[i]), offset, (fm.getHeight()+ins.top)); 

       // Move cursor to the next horizontal position 
      offset += fm.charWidth(chars[i]); 
      } 
     } 
    }