2008-10-24 5 views
1

Plus précisément, j'ai actuellement un JPanel avec un TitledBorder. Je veux personnaliser le look de la frontière. Dans l'état actuel de mon application, le titre est dessiné, mais pas la bordure de ligne elle-même. Si je lier un imagePainter à la méthode panelBorder pour les objets Panel, je peux mettre une image personnalisée autour des panneaux - mais cela n'apparaît que sur les panneaux sur lesquels je n'ai pas explicitement défini la bordure dans le code. Voici ce que le code ressemble à:Personnalisation Java L & F: Comment utiliser synth pour personnaliser les bordures BorderFactory?

<style id="PanelStyle"> 
    <state> 
     <imagePainter method="panelBorder" path="images/thick border.png" sourceInsets="3 3 3 3" /> 
    </state> 
</style> 
<bind style="PanelStyle" type="region" key="Panel" /> 

Comment puis-je faire le contraire - c'est faire de cette image personnalisée apparaît que sur les panneaux que j'ai appliqué un TitledBorder à?

J'ai également essayé d'utiliser un panneau nommé:

panel.setName("MyPanel") 

et un nom de liaison:

<bind style="PanelStyle" type="name" key="MyPanel"> 

Cela me permet de changer le style de seulement panneaux particuliers, ce qui est bon. Cependant, cela ne résout pas le problème original: je ne peux toujours pas personnaliser le NamedBorder de mon panneau.

Si je spécifie un NamedBorder, mon peintre PanelBorder est ignoré et seul le nom est imprimé. Si j'enlève mon NamedBorder, je peux utiliser mon graphique de bordure personnalisé, mais ensuite je dois pousser et aiguillonner ma mise en page pour obtenir un JLabel au même endroit que le titre précédent, ce qui n'est pas souhaitable. D'autres recherches ont découvert que la raison pour laquelle il n'y a pas de ligne de rendu est que le constructeur de TitledBorder prend un argument d'une autre bordure, qu'il rend en plus du titre. Je ne passais pas cet argument, et la valeur par défaut dépend de votre L sélectionné L & F. Retour lorsque j'utilisais le système L & F, la valeur par défaut était un LineBorder. Apparemment, le paramètre par défaut de Synth est un EmptyBorder. Spécifiant explicitement le LineBorder me renvoie la ligne, ce qui résout la plupart de mon problème.

Le reste de mon problème implique l'utilisation d'un graphique personnalisé pour LineBorder. Pour l'instant je deviens en rendant mon graphique personnalisé comme une deuxième image de PanelBackground - il est composé sur le fond réel et réalise l'effet visuel désiré, bien que ce ne soit pas l'implémentation idéale.

Répondre

1

Indiquez le nom du composant que vous souhaitez appliquer le style spécial, et non pas la région:

<bind style="PanelStyle" type="name" key="mySpecialPanel" /> 

Dans votre code Java, vous devez définir le nom du composant pour correspondre au nom que vous avez dans le fichier XML:

panel.setName("mySpecialPanel"); 

Vous pourriez envisager d'étendre DPanel de sorte que tous les panneaux ont le même nom:

public class MySpecialPanel extends JPanel 
{  
    public MySpecialPanel(String title) 
    { 
     super(title); 
     this.setName("mySpecialPanel");  
    } 
} 
0

Nous avons eu le même problème. Bien sûr, votre solution de contournement (que vous avez décrite ci-dessus) fonctionne mais ce n'est pas une solution.

La solution que nous avons utilisé est:

Au lieu de:

BorderFactory.createTitledBorder("title"); 

Vous devez utiliser:

Border objBorder = BorderFactory.createLineBorder(Color.black); 
//Also you can create all the rest of the borders here. 
BorderFactory.createTitledBorder(objBorder, "title"); 
1

ha, a obtenu la raison. À partir de TitledBorder.getBorder, si l'apparence du synthé est utilisée. TitledBorder.border doit être défini dans le fichier xml.

public Border getBorder()  {  
    Border b = border; 
if (b == null) 
    b = UIManager.getBorder("TitledBorder.border"); 
    return b; 
} 

donc ma réponse est:

<object id="TitledBorder_Color" class="java.awt.Color"> 
     <int>140</int> 

     <int>125</int> 

     <int>100</int> 

     <int>255</int> 
    </object> 

    <object id="LineBorder" class="javax.swing.border.LineBorder"> 
     <object idref="TitledBorder_Color"/> 
    </object> 

    <defaultsProperty key="TitledBorder.border" type="idref" value="LineBorder"/> 
Questions connexes