2011-12-20 1 views
7

comment puis-je renvoie correctement XxxSize de JComponent (s) ajouté à la JLabelretourne XxxSize de JComponent (s) ajouté à la JLabel

1er. Figure >>lets LayoutManager works like as for JPanel, JLabel returns Size(0, 0)

enter image description here

2. Figure >>added some PreferredSize to the JLabel

enter image description here

3. Figure >>calculated PreferredSize from JComponent(s) added to the JLabel

enter image description here

4. Figure >>lets LayoutManager works changed JLabel to JPanel, now LayoutManager correctly calculated Dimension without using any XxxSize

enter image description here

avis sice on utilise Nimbus L & F, même sortie est là pour tous accesible L & F

import java.awt.*; 
import java.awt.event.*; 
import java.util.LinkedList; 
import java.util.Queue; 
import javax.swing.*; 

public class NimbusBorderPainterDemo extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame = new JFrame(); 
    private JPanel fatherPanel = new JPanel(), titlePanel = new JPanel(); 
    private JLabel buttonPanel = new JLabel(); 


    //figure ---> 4th. switch JLabel with JPanel 
    //private JPanel buttonPanel = new JPanel(); 
    private Queue<Icon> iconQueue = new LinkedList<Icon>(); 

    public NimbusBorderPainterDemo() { 
     iconQueue.add(UIManager.getIcon("OptionPane.errorIcon")); 
     iconQueue.add(UIManager.getIcon("OptionPane.informationIcon")); 
     iconQueue.add(UIManager.getIcon("OptionPane.warningIcon")); 
     JButton button0 = createButton(); 
     JButton button1 = createButton(); 
     JButton button2 = createButton(); 
     button2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       System.exit(1); 
      } 
     }); 
     int gap = 5; 
     buttonPanel.setLayout(new GridLayout(0, 3, gap, 0)); 
     buttonPanel.add(button0); 
     buttonPanel.add(button1); 
     buttonPanel.add(button2); 

     // figure 1st. ---> without PreferredSize 

     // figure 2nd. ---> 
     //buttonPanel.setPreferredSize(new Dimension(160, 30)); 

     // figure 3rd. ---> 
     /*Dimension dim = button0.getPreferredSize(); 
     int w = dim.width; 
     int h = dim.height; 
     w = (w + 5) * 3; 
     h += 4; 
     dim = new Dimension(w, h); 
     buttonPanel.setPreferredSize(dim);*/ 

     titlePanel.setLayout(new BorderLayout()); 
     titlePanel.add(new JLabel(nextIcon()), BorderLayout.WEST); 
     titlePanel.add(new JLabel("My Frame"), BorderLayout.CENTER); 
     titlePanel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); 
     titlePanel.add(buttonPanel, BorderLayout.EAST); 
     fatherPanel.setLayout(new BorderLayout()); 
     fatherPanel.add(titlePanel, BorderLayout.CENTER); 
     frame.setUndecorated(true); 
     frame.add(fatherPanel); 
     frame.setLocation(50, 50); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    private JButton createButton() { 
     JButton button = new JButton(); 
     button.setBorderPainted(false); 
     button.setBorder(null); 
     button.setFocusable(false); 
     button.setMargin(new Insets(0, 0, 0, 0)); 
     button.setContentAreaFilled(false); 
     button.setIcon(nextIcon()); 
     //button.setRolloverIcon(nextIcon()); 
     //button.setPressedIcon(nextIcon()); 
     //button.setDisabledIcon(nextIcon()); 
     nextIcon(); 
     return button; 
    } 

    private Icon nextIcon() { 
     Icon icon = iconQueue.peek(); 
     iconQueue.add(iconQueue.remove()); 
     return icon; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } catch (Exception fail) { 
       } 
       UIManager.getLookAndFeelDefaults().put("nimbusFocus", Color.RED); 
       NimbusBorderPainterDemo nimbusBorderPainterDemo = new NimbusBorderPainterDemo(); 
      } 
     }); 
    } 
} 
+1

+1 Bonne question, mais pourquoi faire de 'buttonPanel' un' JLabel'? – trashgod

+1

@trashgod parce que 1) impossible de définir l'opacité ou la translucidité pour tous les regards et regards, par exemple en utilisant Nimbus requis un autre Woodoo pour cela, 2) J'ai vu belle usine popup basé sur JLabel – mKorbel

+0

bien que techniquement possible, il est tout simplement faux d'utiliser un JLabel comme conteneur ... – kleopatra

Répondre

7

Le calcul de la taille par défaut préférée consiste à utiliser la disposition gestionnaire pour déterminer la taille préférée d'un composant. Cela signifie que le gestionnaire de disposition parcourt tous les composants enfants pour déterminer la taille préférée de chacun. Pour un JPanel, qui est destiné à être utilisé comme conteneur, ce calcul est utilisé.

Cependant, pour les autres composants Swing, la méthode getPreferredSize() est toujours substituée pour fournir une taille raisonnable pour le composant donné.

Dans le cas d'un JLabel, le calcul de taille préféré prend en compte le texte et l'icône utilisés. Puisque vous n'avez pas fourni la taille préférée est zéro. Bien sûr, si vous remplacez manuellement ce calcul en utilisant la méthode setPreferredSize(), le composant aura une taille préférée. Par conséquent, même si Swing vous permet d'ajouter des composants à n'importe quel composant et d'utiliser un gestionnaire de disposition pour mettre en forme les composants enfants, ces composants enfants ne sont pas utilisés dans le calcul de taille préféré.

Ce n'est pas seulement un problème de Nimbus.

+3

+1 pour faire la lumière sur la nature de la taille préférée. – trashgod