Как возвращает XxxSize из JComponent (s), добавленных в JLabel - PullRequest
7 голосов
/ 20 декабря 2011

как я могу правильно вернуть XxxSize из JComponent (s), добавленных в JLabel

1-й.цифра >> lets LayoutManager works like as for JPanel, JLabel returns Size(0, 0)

enter image description here

2-й.цифра >> added some PreferredSize to the JLabel

enter image description here

3-й.цифра >> calculated PreferredSize from JComponent(s) added to the JLabel

enter image description here

4-й.рисунок >> lets LayoutManager works changed JLabel to JPanel, now LayoutManager correctly calculated Dimension without using any XxxSize

enter image description here

используется уведомление о том, что используется Nimbus L & F, такой же вывод имеется для всех доступных 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 Ответ

7 голосов
/ 20 декабря 2011

Расчет предпочтительного размера по умолчанию заключается в использовании менеджера макета для определения предпочтительного размера компонента. Это означает, что менеджер компоновки перебирает все дочерние компоненты, чтобы определить предпочтительный размер каждого из них. Для JPanel, который предназначен для использования в качестве контейнера, используется этот расчет.

Однако для других компонентов Swing метод getPreferredSize () всегда переопределяется, чтобы обеспечить разумный размер для данного компонента.

В случае JLabel расчет предпочтительного размера учитывает текст и используемый значок. Поскольку вы не указали ни один из них, предпочтительный размер равен нулю. Конечно, если вы вручную переопределите этот расчет с помощью метода setPreferredSize (), тогда компонент будет иметь предпочтительный размер.

Таким образом, несмотря на то, что Swing позволяет добавлять компоненты к любому компоненту и использовать диспетчер компоновки для размещения дочерних компонентов, эти дочерние компоненты не используются в расчете предпочтительного размера.

Это не просто проблема Nimbus.

...