加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何从添加到JLabel的JComponent返回XxxSize

发布时间:2020-12-15 00:47:12 所属栏目:Java 来源:网络整理
导读:如何正确地从添加到JLabel的JComponent返回XxxSize 1.图让LayoutManager像JPanel一样工作,JLabel返回Size(0,0) 第2位.图将一些PreferredSize添加到JLabel 3.图从添加到JLabel的JComponent计算的PreferredSize 4.图让LayoutManager将JLabel改为JPanel,现在Lay
如何正确地从添加到JLabel的JComponent返回XxxSize

1.图>>让LayoutManager像JPanel一样工作,JLabel返回Size(0,0)

第2位.图>>将一些PreferredSize添加到JLabel

3.图>>从添加到JLabel的JComponent计算的PreferredSize

4.图>>让LayoutManager将JLabel改为JPanel,现在LayoutManager正确计算了Dimension而不使用任何XxxSize

注意到使用了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));
        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();
            }
        });
    }
}

解决方法

默认的首选大小计算是使用布局管理器来确定组件的首选大小.这意味着布局管理器遍历所有子组件以确定每个子组件的首选大小.对于要用作Container的JPanel,使用此计算.

但是,对于其他Swing组件,始终会覆盖getPreferredSize()方法,以便为给定组件提供合理的大小.

对于JLabel,首选大小计算会考虑使用的文本和图标.由于您没有提供任何首选大小为零.当然,如果您使用setPreferredSize()方法手动覆盖此计算,则组件将具有首选大小.

因此,即使Swing允许您向任何组件添加组件并使用布局管理器来布局子组件,这些子组件也不会在首选大小计算中使用.

这不仅仅是一个Nimbus问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读