2010-06-07 24 views
2

J'ai un JTextField, où je l'ai mis quelques propriétés personnalisées:Comment garder la frontière de point culminant d'une JComponent, lorsque bordure personnalisée est définie

nameField.setPreferredSize(new Dimension(275,40)); 
nameField.setBackground(bgColor); 
nameField.setForeground(txtColor); 
nameField.setFont(new Font("HelveticaNeue",Font.PLAIN,22)); 
nameField.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2)); 

Lorsque le composant a le focus, il n'y a pas fort montré autour du terrain. Sur un Mac, il s'agit généralement d'un rectangle rougeoyant, indiquant que ce composant a un focus. Si je commente le nom name.Field.setBorder (...), la surbrillance réapparaît. Comment puis-je conserver le surlignement, mais aussi ma bordure personnalisée?

Fondamentalement, je veux juste que la bordure de mise en évidence apparaisse lorsque le composant a le focus, et pas de bordure lorsque le composant est flou.

Notez que la bordure d'origine est de type com.apple.laf.AquaTextFieldBorder.

Répondre

2

Fondamentalement, je veux juste le point fort-frontière pour afficher lorsque le composant a le focus, et aucune frontière lorsque le composant est non focalisée.

Vous devez utiliser un FocusListener. Vous devez d'abord enregistrer la bordure actuelle. Ensuite, sur focusLost vous définissez la bordure sur null et sur focusGained vous utilisez la bordure sauvegardée.

Vous pouvez également obtenir la bordure par défaut du composant à l'aide d'UIManager.

+0

Vos deux réponses fonctionnent, dans une certaine mesure. Mais il y a un problème. La bordure d'origine semble être une bordure composée, avec le point culminant comme bordure extérieure, et une bordure de ligne blanche 1px comme l'intérieur. Je ne veux pas de la frontière intérieure! Note: J'ai sur OS X, et le type de la bordure d'origine est en fait com.apple.laf.AquaTextFieldBorder –

1

Vous pourriez être en mesure de le faire avec un CompoundBorder. Sous Windows avec l'aspect et la convivialité de Nimbus je peux reproduire le problème. Je peux obtenir les deux bordures à afficher avec le code suivant:

Border lineBorder = BorderFactory.createLineBorder(Color.WHITE, 2); 
    Border originalBorder = nameField.getBorder(); 
    CompoundBorder compoundBorder = new CompoundBorder(lineBorder, originalBorder); 
    nameField.setBorder(compoundBorder);