2011-09-07 17 views
11

Come posso aggiungere una nuova riga a JLabel? So che se uso HTML semplice, funzionerà. Ma se uso html, JLabel non mostra il carattere incorporato nell'applicazione. Sto incorporando il carattere usando il metodo - createFont() e usando JLabel.setFont() per applicare il carattere.Come aggiungere una nuova riga a JLabel senza utilizzare l'HTML

risposta

4

sto incorporare il tipo di carattere con il metodo - createFont()) e l'utilizzo di JLabel.setFont() per applicare il tipo di carattere.

Invece provare a impostarlo nell'HTML, come mostrato here.

+0

Dal mio punto di vista, il problema principale con l'utilizzo di HTML è la perdita di base, che la maggior parte dei gestori di layout utilizza oggigiorno (e questo è un buon punto IMHO) – jfpoilpret

3

JLabel non è originariamente previsto per il testo multilinea, da quello che ricordo. Dovresti sovrascrivere i vari metodi di rendering per dividere manualmente la linea di testo.

Forse dovresti usare un JTextArea non modificabile se vuoi etichette multilinea.

1

1) se si vuole JComponents multilinea senza utilizzare JLabel, allora si deve guardare per TextComponent come lo sono JTextArea, JTextPane, JEditorPane, se should't essere modificabili poi myTextComponent#setEditable(false);

2) non vedo mai problemi con html & carattere & colori in swing, per esempio:

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


Non penso che ci sia un modo diretto (e facile) di fare JLabel con più linee senza ricorrere all'HTML. Puoi invece utilizzare JTextArea.

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

Dovrebbe sembrare quasi lo stesso. Se si dispone di diversi tipi di carattere per i componenti diversi, è possibile aggiungere la seguente riga al fine di garantire che il carattere del JTextArea è lo stesso con JLabel

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

Spero che questo aiuti.

+0

posso allineare il testo di un JTextArea ?? – Nauphal

+0

Controlla questo post http: // stackoverflow.it/questions/3213045/centering-text-in-a-jtextarea-o-jtextpane-allineamento del testo orizzontale – Serhiy

9

SwingX supporta etichette multilinea:

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

JXLabel ha la linea di base "giusta" quando si usano più righe di testo? Nota che "giusto" può significare cose diverse per persone diverse ;-) – jfpoilpret

+0

@jfpoilpret - non so. Quale sarebbe la linea di base corretta? – kleopatra

+0

per me la linea di base corretta sarebbe la linea di base del primo carattere della prima riga dell'etichetta. Ma sono sicuro che potresti trovare altre persone che preferiscono una linea di riferimento centrata sull'intera altezza dell'etichetta, ad esempio; altre persone potrebbero anche voler che la linea di base sia la linea di base del primo carattere della riga LAST nell'etichetta. In realtà dipende da come le persone vogliono che le etichette siano allineate nei loro layout. Penso che il mio primo suggerimento abbia più senso. – jfpoilpret

1

La maggior parte del codice seguente è tratto da BasicLabelUI e/o WindowsLabelUI ma ho aggiunto il codice per farlo funzionare con più linee. Questa era la quantità minima di codice copiato che potevo ottenere per funzionare. È possibile impostare il carattere separatore tra le righe con setSeparator o modificando il valore predefinito nell'istanza di LinesAndIndex. Non ho fatto test approfonditi su questo, ma funziona finora per me. Quando si utilizza HTML il mnemonico non ha funzionato, quindi l'ho creato. Se hai un modo migliore per farlo, correggi il codice.

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; 
      } 
     } 

    } 
Problemi correlati