2011-09-07 53 views

回答

4

我是使用方法 - createFont())嵌入字體並使用JLabel.setFont()來應用字體。

請嘗試在HTML中設置它,如here所示。

+0

從我viewpoitn,使用HTML的主要問題是基礎,大多數佈局管理使用時下其中的損失(和這是一個很好的點恕我直言) – jfpoilpret

3

JLabel最初不是用於多行文字,從我記得的東西。您需要重寫各種呈現方法來手動進行文本行分割。

也許你應該使用不可編輯的JTextArea,如果你想要多行標籤。

1

,如果你想多行JComponents不使用的JLabel 1),那麼你就必須尋找TextComponent因爲是JTextArea,使其的JTextPane,JEditorPane中,如果should't可編輯然後myTextComponent#setEditable(false);

2)我從來沒有看到問題HTML &字體&顏色在搖擺,例如:

enter image description here

import java.awt.Color; 
import java.awt.Font; 
import javax.swing.*; 

public class ButtonFg extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public ButtonFg() { 
     JButton button = new JButton("<html> - myText <br>" 
       + " - myText <br>" 
       + " - myText <br>" 
       + " - myText </html>"); 
     button.setForeground(Color.blue); 
     button.setFont(new Font("Serif", Font.BOLD, 28)); 
     button.setFocusPainted(false); 
     add(button); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocation(150, 150); 
     pack(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ButtonFg().setVisible(true); 
      } 
     }); 
    } 
} 
7


我不認爲有直接(並且容易)做多行JLabel的方式沒有反覆到HTML。您可以改用JTextArea。

JTextArea textArea = new JTextArea(); 
textArea.setEditable(false); 
textArea.setLineWrap(true); 
textArea.setOpaque(false); 
textArea.setBorder(BorderFactory.createEmptyBorder()); 
add(textArea, BorderLayout.CENTER); 

它應該看起來差不多。如果您有不同的組件不同的字體,你可以添加以下行,以確保JTextArea中的字體是一個JLabel

textArea.setFont(UIManager.getFont("Label.font")); 

希望這有助於相同。

+0

我可以對齊JTextArea的文本? – Nauphal

+0

檢查這篇文章http:// stackoverflow。COM /問題/ 3213045 /居中文本-IN-A-的JTextArea或 - JTextPane的水平文本對齊 – Serhiy

9

SwingX支持多標籤:

JXLabel label = new JXLabel(); 
    label.setLineWrap(true); 
+0

當使用多行文本時,JXLabel是否具有「正確的」基準?請注意,「正確」可能對不同的人意味着不同的事情;-) – jfpoilpret

+0

@jfpoilpret - 不知道。什麼是正確的基準? – kleopatra

+0

對於我來說,正確的基線將是標籤第一行第一個字符的基線。但我相信你可以找到其他人更喜歡以標籤的整個高度爲中心的基線;其他人可能也希望基線成爲標籤中最後一行的第一個字符的基線。它實際上取決於人們希望標籤在佈局中對齊的方式。我認爲我的第一個建議最有意義。 – jfpoilpret

1

大多數下面的代碼是從BasicLabelUI和/或WindowsLabelUI拍攝,但我添加代碼,使其與多行工作。這是我可以開始工作的最小代碼量。您可以使用setSeparator在行之間設置分隔符,也可以通過更改LinesAndIndex實例的默認值來設置分隔符。我還沒有做過這方面的廣泛測試,但迄今爲止它對我很有用。當使用HTML助記符不起作用,所以我創建了這個。如果您有更好的方法來完成此操作,請更正代碼。

import com.sun.java.swing.plaf.windows.WindowsLabelUI; 
    import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; 
    import java.awt.Color; 
    import java.awt.FontMetrics; 
    import java.awt.Graphics; 
    import java.awt.Insets; 
    import java.awt.Rectangle; 
    import java.util.ArrayList; 
    import java.util.List; 
    import javax.swing.Icon; 
    import javax.swing.JComponent; 
    import javax.swing.JLabel; 
    import javax.swing.UIManager; 
    import javax.swing.plaf.LabelUI; 
    import javax.swing.plaf.basic.BasicGraphicsUtils; 
    import javax.swing.plaf.basic.BasicHTML; 
    import javax.swing.text.View; 

    public class MultiLineLabelUI extends WindowsLabelUI { 
     private static MultiLineLabelUI multiLineLabelUI; 
     private LinesAndIndex lai = new LinesAndIndex(','); 
     private Rectangle paintIconR = new Rectangle(); 
     private Rectangle paintTextR = new Rectangle(); 
     public static LabelUI createUI(JComponent c) { 
      if (multiLineLabelUI == null) { 
       multiLineLabelUI = new MultiLineLabelUI(); 
      } 
      return multiLineLabelUI; 
     } 
     private int getBaseline(JComponent c, int y, int ascent, int w, int h) { 
      View view = (View) c.getClientProperty(BasicHTML.propertyKey); 
      if (view != null) { 
       int baseline = BasicHTML.getHTMLBaseline(view, w, h); 
       if (baseline < 0) { 
        return baseline; 
       } 
       return y + baseline; 
      } 
      return y + ascent; 
     } 
     public char getSeparator() { 
      return lai.getSeparator(); 
     } 
     public void setSeparator(char ch) { 
      lai.setSeparator(ch); 
     } 
     private String layout(JLabel label, FontMetrics fm, 
       int width, int height, int lineCnt, int curLine, String text) { 
      Insets insets = label.getInsets(null); 
      Icon icon = (label.isEnabled()) ? label.getIcon() 
        : label.getDisabledIcon(); 
      Rectangle paintViewR = new Rectangle(); 
      paintViewR.width = width - (insets.left + insets.right); 
      paintViewR.height = (height - (insets.top + insets.bottom))/lineCnt; 
      paintViewR.x = insets.left; 
      paintViewR.y = insets.top + (paintViewR.height * curLine); 
      paintIconR.x = 0; 
      paintIconR.y = 0; 
      paintIconR.width = 0; 
      paintIconR.height = 0; 
      paintTextR.x = 0; 
      paintTextR.y = 0; 
      paintTextR.width = 0; 
      paintTextR.height = 0; 
      return layoutCL(label, fm, text, icon, paintViewR, paintIconR, 
        paintTextR); 
     } 
     protected void paintEnabledText(JLabel l, Graphics g, 
       String s, int textX, int textY, int curLine) { 
      int mnemonicIndex = lai.getMnemonicIndex(); 
      // W2K Feature: Check to see if the Underscore should be rendered. 
      if (WindowsLookAndFeel.isMnemonicHidden() == true) { 
       mnemonicIndex = -1; 
      } 
      if (curLine != lai.getMnemonicLineIndex()) { 
       mnemonicIndex = -1; 
      } 

      g.setColor(l.getForeground()); 
      BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex, 
        textX, textY); 
     } 
     protected void paintDisabledText(JLabel l, Graphics g, 
       String s, int textX, int textY, int curLine) { 
      int mnemonicIndex = lai.getMnemonicIndex(); 
      // W2K Feature: Check to see if the Underscore should be rendered. 
      if (WindowsLookAndFeel.isMnemonicHidden() == true) { 
       mnemonicIndex = -1; 
      } 
      if (curLine != lai.getMnemonicLineIndex()) { 
       mnemonicIndex = -1; 
      } 
      if (UIManager.getColor("Label.disabledForeground") instanceof Color 
        && UIManager.getColor("Label.disabledShadow") instanceof Color) { 
       g.setColor(UIManager.getColor("Label.disabledShadow")); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex, 
         textX + 1, textY + 1); 
       g.setColor(UIManager.getColor("Label.disabledForeground")); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex, 
         textX, textY); 
      } else { 
       Color background = l.getBackground(); 
       g.setColor(background.brighter()); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex, 
         textX + 1, textY + 1); 
       g.setColor(background.darker()); 
       BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex, 
         textX, textY); 
      } 
     } 
     @Override 
     public void paint(Graphics g, JComponent c) { 
      JLabel label = (JLabel) c; 
      String text = label.getText(); 
      Icon icon = (label.isEnabled()) 
        ? label.getIcon() 
        : label.getDisabledIcon(); 

      if ((icon == null) && (text == null)) { 
       return; 
      } 
      char mnemonic = (char) label.getDisplayedMnemonic(); 
      lai.splitText(text, mnemonic); 
      List<String> lines = lai.getLines(); 

      FontMetrics fm = label.getFontMetrics(g.getFont()); 
      String[] clippedText = new String[lines.size()]; 
      for (int i = 0; i < lines.size(); i++) { 
       clippedText[i] = layout(label, fm, c.getWidth(), c.getHeight(), 
         lines.size(), i, lines.get(i)); 

       if (icon != null && i == 0) { 
        icon.paintIcon(c, g, paintIconR.x, paintIconR.y); 
       } 

       if (text != null) { 
        int textX = paintTextR.x; 
        int textY = paintTextR.y + fm.getAscent(); 

        if (label.isEnabled()) { 
         paintEnabledText(label, g, clippedText[i], textX, 
           textY, i); 
        } else { 
         paintDisabledText(label, g, clippedText[i], textX, 
           textY, i); 
        } 
       } 
      } 
     } 
     @Override 
     public int getBaseline(JComponent c, int width, int height) { 
      super.getBaseline(c, width, height); 
      JLabel label = (JLabel) c; 
      String text = label.getText(); 
      if (text == null || "".equals(text) || label.getFont() == null) { 
       return -1; 
      } 
      char mnemonic = (char) label.getDisplayedMnemonic(); 
      lai.splitText(text, mnemonic); 
      List<String> lines = lai.getLines(); 
      FontMetrics fm = label.getFontMetrics(label.getFont()); 
      String[] clippedText = new String[lines.size()]; 
      for (int i = 0; i < lines.size(); i++) { 
       clippedText[i] = layout(label, fm, width, height, lines.size(), i, 
         lines.get(i)); 
      } 
      return getBaseline(label, paintTextR.y, fm.getAscent(), 
        paintTextR.width, paintTextR.height); 
     } 

     private static class LinesAndIndex { 
      private char sep; 
      private List<String> lines; 
      private int mnemonicLineIndex; 
      private int mnemonicIndex; 
      LinesAndIndex(char sep) { 
       mnemonicLineIndex = -1; 
       mnemonicIndex = -1; 
       lines = new ArrayList<String>(); 
       this.sep = sep; 
      } 
      public char getSeparator() { 
       return sep; 
      } 
      public void setSeparator(char sep) { 
       this.sep = sep; 
      } 
      public List<String> getLines() { 
       return lines; 
      } 
      public int getMnemonicLineIndex() { 
       return mnemonicLineIndex; 
      } 
      public int getMnemonicIndex() { 
       return mnemonicIndex; 
      } 
      public void splitText(String text, char mnemonic) { 
       if (text == null) { 
        return; 
       } 
       lines.clear(); 
       mnemonicLineIndex = -1; 
       mnemonicIndex = -1; 
       char um = Character.toUpperCase(mnemonic); 
       char lm = Character.toLowerCase(mnemonic); 
       int umi = Integer.MAX_VALUE; 
       int lmi = Integer.MAX_VALUE; 
       int umli = -1; 
       int lmli = -1; 
       for (int i = 0, j = 0, k = 0; i < text.length(); i++) { 
        if (text.charAt(i) == sep) { 
         lines.add(text.substring(j, i)); 
         j = i + 1; 
         k++; 
        } else if (text.charAt(i) == um) { 
         if (umi == Integer.MAX_VALUE) { 
          umi = i - j; 
          umli = k; 
         } 
        } else if (text.charAt(i) == lm) { 
         if (lmi == Integer.MAX_VALUE) { 
          lmi = i - j; 
          lmli = k; 
         } 
        } 
        if (i == text.length() - 1) { 
         lines.add(text.substring(j, i + 1)); 
        } 
       } 
       mnemonicLineIndex = (lmi < umi) ? lmli : umli; 
       mnemonicIndex = (lmi < umi) ? lmi : umi; 
      } 
     } 

    } 
相關問題