2010-07-07 5 views
3

J'ai du mal à faire apparaître un JSeparator à l'intérieur d'un JToolBar. Ma barre d'outils est créé comme suit:Pourquoi addSeparator() ne fonctionne pas avec mon JToolBar?

public class ToolBar extends JToolBar { 
    super(); 

    FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 10, 5); 
    setLayout(layout); 

    add(new JButton("Button 1")); 
    addSeparator(); 
    add(new JButton("Button 2")); 
    add(new JButton("Button 3")); 
    addSeparator(); 

    // Show 
    setVisible(true); 
    setFloatable(false); 

} 

Toute pensée serait vraiment apprécié, j'ai essayé d'obtenir que cela fonctionne depuis trop longtemps maintenant> (

+0

Hm, êtes-vous que le code que vous avez fourni est ce que vous utilisez réellement, je ne suis pas sûr que cela va compiler; est la déclaration d'une méthode manquante ...? –

+0

fd, a répondu à votre commentaire en supprimant tout code personnalisé. Cela devrait compiler facilement, et montre toujours le problème que j'espère résoudre. Merci! – Hamy

Répondre

4

Essayer votre code là, quand je l'appelle la addSeparator() méthode, il crée un espace entre les touches, mais pas de ligne de séparation visible.

Mais si je change la méthode pour addSeparator(new Dimension(20,20)) il crée alors la ligne de séparation visible.

le problème c Ould être que l'apparence par défaut crée un séparateur de hauteur 1 de sorte que vous seriez incapable de le voir.

Je l'utilise sous Mac OSX.

+0

Oui, c'est la même solution de contournement que j'ai rencontrée. Je pense qu'il peut juste être un problème avec le défaut OS X LAF – Hamy

+0

Je trouve également que si vous laissez la disposition par défaut sur la barre d'outils, la ligne pointillée apparaît là aussi. – Trejkaz

2

Le plus gros problème que vous avez est qu'il n'est pas nécessaire de sous-classer JToolBar et de définir la mise en page dessus. Créez simplement une instance et commencez à ajouter des boutons et des séparateurs.

En général, l'équipe Swing ne recommande pas de sous-classer les composants Swing.

Code Vous devriez ressembler à:

JToolBar t = new JToolbar(); 

t.add(new JButton("Button 1")); 
t.addSeparator(); 
t.add(new JButton("Button 2")); 
t.add(new JButton("Button 3")); 
t.addSeparator(); 

// Show 
t.setVisible(true); 
t.setFloatable(false); 

Le dernier conseil serait de ne pas utiliser les boutons. Utilisez des actions. De cette façon, les mêmes actions peuvent être utilisées sur la barre d'outils, menus ect. Plus d'infos sur http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

MISE À JOUR: La façon dont le séparateur de barre d'outils se dépend de LAF que vous utilisez.

+0

eugener, j'ai vraiment * lutté * avec cela. J'ai une tonne d'éléments sous-classés - JToolbar, JPanel, JButton, etc. - pour lesquels la plupart d'entre eux n'ont pas besoin d'être des sous-classes. Je viens d'essayer de ne pas écrire tout mon code dans une seule méthode ou dans une seule classe !! Je peux le faire, mais c'est comme 20 pages et difficile à maintenir. Dans un sens, je sais que le sous-classement n'est pas la bonne chose à faire, mais je ne veux pas non plus d'énormes fichiers non maintenables: (En gros, je ne connais pas la bonne réponse ici. – Hamy

+2

La façon la plus courante de gérer cela est de créer des méthodes "build" Par exemple, si vous avez besoin de construire la barre d'outils, créez la méthode JToolBar buildToobar(), où vous créez, configurez et renvoyez votre barre d'outils. La seule fois où vous devez sous-classer des composants Swing est lorsque vous avez besoin d'ajouter un nouvel état et/ou un comportement à eux. –

+0

Hm. Je suppose que je pourrais utiliser une classe Factory, de sorte que je ne me suis pas retrouvé avec ma classe principale étant gonflé avec des méthodes de construction ...()? – Hamy

0

J'ai rencontré le même problème. J'ai trouvé que la cause première était due à la taille maximale.

Après l'avoir réglé, il est devenu normal.

// --------------------------------------- 
    // debug below: 
    // --------------------------------------- 
    JSeparator separator = new JSeparator(JSeparator.VERTICAL); 
    System.err.println("getMaximumSize(): " + separator.getMaximumSize()); 
    System.err.println("getMinimumSize(): " + separator.getMinimumSize()); 
    separator.setMaximumSize(new Dimension(2, separator.getMaximumSize().height)); 


    // --------------------------------------- 
    // real sample below 
    // --------------------------------------- 
    // adds a vertical space bar 
    toolBar.add(Box.createHorizontalStrut(5)); 

    // adds a vertical separator 
    JSeparator separator = new JSeparator(JSeparator.VERTICAL); 
    Dimension maximumSize = separator.getMaximumSize(); 
    maximumSize.width = 2; 
    separator.setMaximumSize(maximumSize); // Important! Update it! 
    toolBar.add(separator); 

    // adds a vertical space bar 
    toolBar.add(Box.createHorizontalStrut(5)); 

par TJ Tsai ([email protected])

Questions connexes