2009-06-26 5 views

Antwort

1

Eine Option, die ich verwenden würde, ist eine Folge von JLabels zu haben. Nur mit Symbol und nur mit Text.

Die andere Option wäre die Mini-HTML-Unterstützung des JLabel zu nutzen:

<html><img src='theimage.png'>The text<img src='theimage2.png'> 

als Text des JLabel hat. Dieser Ansatz funktioniert für die Textformatierung, aber ich bin mir nicht sicher, ob die Bild-Tags auch dort funktionieren.

Oder haben Sie die JLabel.paint() überschrieben, um benutzerdefinierte Rendering btw zu tun?

Dann würde ich den folgenden Ansatz verwenden:

List<Object> textAndImage = new ArrayList<Object>() {{ 
    add("This "); 
    add(new ImageIcon("image1.png")); 
    add(" is "); 
    add(new ImageIcon("image2.png")); 
    add(" an "); 
    add(" imaged text sample "); 
}}; 
FontMetrics fm = g.getFontMetrics(); 
int x = 0; 
for (Object o : textAndImage) { 
    if (o instanceof String) { 
     g.drawString((String)o, x, fm.getHeight()); 
     x += fm.stringWidth((String)o); 
    } else 
    if (o instanceof ImageIcon) { 
     ((ImageIcon)o).paintIcon(null, g, x, 0); 
     x += ((ImageIcon)o).getIconWidth(); 
    } 
} 

Natürlich ist dies nicht eine vollwertige Lösung ist aber könnten Sie ein paar Hinweise geben, wie Sie vorgehen.

+1

Tags sollte funktionieren, aber HTML-Unterstützung in Swing ist fehlerhaft wie heck. Ein bemerkenswerter Fehler ist, dass bei Verwendung von HTML die L & F-spezifizierten Schriften nicht mehr funktionieren. – Joey

+0

Die Option, mit dynamisch abgerufenen Bildern zu verwenden, funktioniert nicht. Hat die paintComponent für JLabel überschrieben, aber die Reihenfolge von Text und Bild wird nicht vollständig dargestellt. Soll die Größe des Jabels vor dem Lackieren eingestellt werden? –

+0

Basierend auf Informationen anderer Posts: Wenn Sie versuchen, BMPs oder andere nicht unterstützte Images in ein ImageIcon zu laden, funktioniert das nicht. Verwenden Sie die ImageIO.read() -Methode, um das Bild zu erhalten. Wenn das Label keine Größe hat, wird nichts gerendert. Versuchen Sie, es in einen BorderLayout-Container in der CENTER-Region zu platzieren. – akarnokd

1

Eine Möglichkeit besteht darin, einen benutzerdefinierten Rahmen zu verwenden, der ein Symbol (und einen Text, wenn Sie möchten) malt, sodass Sie unbegrenzt verschachteln können.

Hier ist eine solche Grenze:

/** 
* Show a leading or trailing icon in border. 
*/ 
public static class IconBorder implements Border 
{ 
    /** 
    * @param icon - icon to paint for this border 
    * @param top outer insets for this border 
    * @param left 
    * @param bottom 
    * @param right 
    */ 
    public IconBorder(Icon icon, int top, int left, int bottom, int right) 
    { 
     setIcon(icon); 
     top_ = top; 
     left_ = left; 
     bottom_ = bottom; 
     right_ = right; 
     rect_ = new Rectangle(0, 0, icon_.getIconWidth(), icon_.getIconHeight()); 
    } 

    public Insets getBorderInsets(Component c) 
    { 
     if(icon_ == null) 
      return new Insets(0, 0, 0, 0); 
     return isTrailing_ ? new Insets(top_, left_, bottom_, icon_.getIconWidth() + right_) : 
          new Insets(top_, icon_.getIconWidth() + left_, bottom_, right_); 
    } 

    public boolean isBorderOpaque() 
    { 
     return false; 
    } 

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) 
    { 
     if(icon_ != null) 
     { 
      if(isTrailing_) 
       x = width - icon_.getIconWidth() + 4; 
      else 
       x += left_ - 1; 
      icon_.paintIcon(c, g, x, y + top_); 
      rect_.x = x; 
      rect_.y = y; 
     } 
    } 

    public void setIcon(Icon icon) 
    { 
     if(icon_ != icon) 
      icon_ = icon; 
    } 

    public Icon getIcon() 
    { 
     return icon_; 
    } 

    public void setPosition(boolean isTrailing) 
    { 
     isTrailing_ = isTrailing;   
    } 

    public Rectangle getIconRect() 
    { 
     return rect_; 
    } 

    private final int top_; 
    private final int left_; 
    private final int bottom_; 
    private final int right_; 
    private final Rectangle rect_; 
    private Icon icon_; 
    private boolean isTrailing_ = true; 
} 

Ich benutze dies ein Suchsymbol auf einem JTextField (a la Browser-Suchfeld) hinzuzufügen. getIconRect kann verwendet werden, um den Mauszeiger zu überprüfen. Zum Beispiel ändere ich den Cursor auf HAND_CURSOR, wenn die Maus über dem Suchsymbol ist.