2010-03-25 9 views
5

Salut est-il possible de placer une icône dans le titre d'un titledBorder par exemple le code suivant:Icône dans titledBorder titre


import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.TitledBorder; 

public class TitledExample extends JPanel { 

    public TitledExample() { 
    super(true); 

    this.setLayout(new GridLayout(1, 1, 5, 5)); 

    JLabel label = new JLabel("Titled Border"); 
    label.setHorizontalAlignment(JLabel.CENTER); 

    TitledBorder titled = new TitledBorder("Image here ?? Title"); 
    label.setBorder(titled); 

    add(label); 
    } 

Merci, Cheers

+0

J'ai besoin de faire quelque chose comme ça s'il était possible. Les exigences pour un titre personnalisé sont Java String. Dans mon cas au moins, je dois laisser des espaces pour utiliser l'approche @rhu. Sinon, _one_ peut créer sa propre fabrique de bordure et créer une bordure avec une étiquette d'icône et une étiquette de titre (texte). Je ne sais pas si je vais avoir le temps de le faire. – will

Répondre

5

Il est probablement pas ce que vous voulez, mais peut-être un joli Unicode™ glyph ou deux ferait l'affaire.

Addendum: @rhu's approach est préférable, mais je ne pouvais pas résister à essayer ceci:

enter image description here

TitledBorder titled = BorderFactory.createTitledBorder("\u2615"); 
titled.setTitleFont(new Font(Font.Dialog, Font.PLAIN, 32)); 
titled.setTitleColor(Color.blue); 
label.setBorder(titled); 
+0

J'ai utilisé votre code, mais cela ne fonctionne pas pour moi .. quand vous créez wtorteTitledBorder ("\ u2615"); Vous mettez le nom de l'icône dans le répertoire principal, quand je mets le chemin de l'icône le chemin est apparu dans le titre de titre au lieu de l'icône elle-même – BDeveloper

+0

@BDeveloper: Le paramètre 'createTitledBorder()' n'est pas une icône; c'est un 'String' contenant le [Unicode escape] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.3) pour le point de code [' HOT BOISSON (U + 2615) '] (http://www.fileformat.info/info/unicode/char/2615/index.htm). – trashgod

+0

_btw_ Dialog a travaillé pour moi quand Tahoma m'a laissé tomber. – will

8

Essayez TitledBorder le sous-classement, et remplacer la méthode paintBorder:

@Overide 
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) 
{ 
    super.paintBorder(c, g, x, y, width, height); 

    // Now use the graphics context to draw whatever needed 
    g.drawImage(img, xImageOffset, yImageOffset, imgWidth, imgHeight, observer); 
} 

Pas désespérément Assurez-vous que cela est tout à fait juste appel de méthode, mais vous avez l'idée; Une fois que vous avez accès à l'objet Graphics, vous pouvez peindre à peu près tout ce dont vous avez besoin.

0

Le TitledBorder utilise un JLabel pour peindre le texte sur la bordure. Malheureusement, le JLabel est un domaine privé. Vous pouvez ajouter l'icône de deux manières:

  • d'accéder au champ JLabel privé et de définir l'icône sur le JLabel.

  • sous-classe TitledBorder et de ré-implémenter la méthode paintBorder. Je voudrais probablement ajouter un constructeur qui prend un JLabel afin que
    contrôle ce qui est peint sur la frontière.

1

Vous pouvez utiliser la réflexion pour accéder au JLabel utilisé par le TitledBorder.

try 
{ 
    // Get the field declaration 
    Field f = TitledBorder.class.getDeclaredField("label"); 
    // Make it accessible (it normally is private) 
    f.setAccessible(true); 
    // Get the label 
    JLabel borderLabel = (JLabel)f.get(titledBorder); 
    // Put the field accessibility back to default 
    f.setAccessible(false); 
    // Set the icon and do whatever you want with your label 
    borderLabel.setIcon(myIcon); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

Il est important de noter que cela ne fonctionnera pas en Java 10, car il aura des règles plus strictes sur l'utilisation des setAccessible

Questions connexes