2011-12-20 7 views
7

cómo puedo correctamente devuelve XxxSize de JComponent (s) que se añade a la JLabelvuelve XxxSize de JComponent (s) que se añade a la JLabel

primero. Figura >>lets LayoutManager works like as for JPanel, JLabel returns Size(0, 0)

enter image description here

segundo. Figura >>added some PreferredSize to the JLabel

enter image description here

tercero. Figura >>calculated PreferredSize from JComponent(s) added to the JLabel

enter image description here

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

enter image description here

aviso SICE se utiliza Nimbus L & F, misma salida está ahí para todos 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 Buena pregunta, pero ¿por qué hacer 'buttonPanel' un' JLabel' en absoluto? – trashgod

+1

@trashgod porque 1) no es posible establecer Opacidad o Translucidez para todos los conocidos Look and Feels, ejemplo usando Nimbus requirió otro Woodoo para eso, 2) Vi una buena fábrica emergente basada en JLabel – mKorbel

+0

mientras que técnicamente es posible, es simplemente incorrecto usar un JLabel como contenedor ... – kleopatra

Respuesta

7

El cálculo del tamaño preferido por defecto es usar la disposición gerente para determinar el tamaño preferido de un componente. Esto significa que el administrador de diseño itera a través de todos los componentes secundarios para determinar el tamaño preferido de cada uno. Para un JPanel, que debe usarse como un Contenedor, se usa este cálculo.

Sin embargo, para otros componentes Swing, el método getPreferredSize() siempre se reemplaza para proporcionar un tamaño razonable para el componente dado.

En el caso de un JLabel, el cálculo de tamaño preferido tiene en cuenta el texto y el icono utilizado. Como no proporcionó el tamaño preferido, es cero. Por supuesto, si anula manualmente este cálculo utilizando el método setPreferredSize(), el componente tendrá un tamaño preferido.

De modo que aunque Swing le permite agregar componentes a cualquier componente y usar un administrador de diseño para diseñar los componentes secundarios, estos componentes secundarios no se utilizan en el cálculo de tamaño preferido.

Esto no es solo un problema de Nimbus.

+3

+1 para arrojar luz sobre la naturaleza del tamaño preferido. – trashgod

Cuestiones relacionadas