【问题标题】:How to change JLabel's size when the font size is changed?更改字体大小时如何更改 JLabel 的大小?
【发布时间】:2015-07-14 11:57:30
【问题描述】:

我有一个 JLabel。 JLabel的代码如下。

panelmain = new JPanel();
panelmain.setLayout(null);
panelmain.setPreferredSize(new java.awt.Dimension(800, 600));
panelmain.addComponentListener(listen);
panelmain.setBorder(null);
titlebar = new JLabel("Hello World");
titlebar.setBounds(10, 10, 100, 30);
panelmain.add(titlebar);

我的问题是,如果我改变titlebar的字体(即JLabel),那么如何改变titlebar的大小(在代码中已经设置为titlebar.setBounds(10, 10, 100, 30);)?

由 Girish 编辑

我的完整代码如下。

import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class IFrame extends JInternalFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 6526561589695424088L;

    private JScrollPane jsp;

    private IFListen listen;

    private JPanel panelmain;

    protected JPanel panel;

    private String title;

    private JLabel titlebar;

    public IFrame()
    {
        this.title="";
        init();
    }

    public IFrame(String title)
    {
        this.title=title;
        init();
    }

    private void init()
    {
        setLayout(null);

        listen=new IFListen();
        panelmain=new JPanel();
            panelmain.setLayout(null);
            panelmain.setPreferredSize(new java.awt.Dimension(800, 600));
            panelmain.addComponentListener(listen);
            panelmain.setBorder(null);

            titlebar=new JLabel("Hello World");
            titlebar.setFont(new java.awt.Font("Monotype Corsiva", 1, 48));
            panelmain.add(titlebar);

            panel=new JPanel();
            panel.setBorder(javax.swing.BorderFactory.createTitledBorder(title));
            panel.setMinimumSize(new java.awt.Dimension(400, 400));
            panel.setSize(400, 400);
            panelmain.add(panel);

        jsp=new JScrollPane(panelmain);
        jsp.setBorder(null);

        add(jsp);

        this.addComponentListener(listen);
    }

    //INFO Custom Methods
    public void setTitleFont(java.awt.Font font)
    {
        titlebar.setFont(font); //Here I want to change size of label.
    }

    //INFO Listener Class for IFrame
    private class IFListen implements ComponentListener
    {
        //INFO Overridden Methods
        @Override
        public void componentResized(ComponentEvent e) 
        {
            if(e.getSource() instanceof IFrame)
                jsp.setBounds(5, 5, getWidth()-20, getHeight()-20);
            else if(e.getSource()==panelmain)
            {
                panel.setLocation(Integer.parseInt(panelmain.getWidth()/2-panel.getWidth()/2+""), 0);
            }
        }

        //INFO Unimplemented Methods
        @Override
        public void componentShown(ComponentEvent arg0) {}

        @Override
        public void componentHidden(ComponentEvent arg0) {}

        @Override
        public void componentMoved(ComponentEvent arg0) {}
    }
}

我已经评论了字体大小改变的地方,我想改变 jlabel 的大小。

【问题讨论】:

  • 不使用 setBounds? JLabel 将在字体更改时调整大小。
  • 现在你有一个具体的例子来说明为什么你不应该绝对定位元素,而是使用布局管理器。布局管理器负责处理。
  • 不要使用 setPreferredSize,您已经阻止标签计算它需要的大小。不要使用空布局,使用适当的布局
  • “我不想使用任何布局。”顺便说一句,请检查null-layout-manager 标签中的一些问题。我猜想在已接受答案的问题中,19/20(或可能更高)通过使用布局(+填充和空白边框)得到解决。
  • 好的。因此,如果没有布局管理器,您所拥有的将无法工作,也无法与布局管理器一起使用。因此,无论解决方案如何,您都需要修复。这里所有经过实验的开发人员都告诉您使用布局管理器。你认为你应该怎么做?尝试使用布局管理器进行操作,如果仍然有问题,请执行 Andrew 告诉您的操作。在上面的评论中。

标签: java swing layout-manager null-layout-manager


【解决方案1】:

不要使用setPreferredSize,你刚刚删除了标签用来计算它想要的大小的所有计算。

避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

使用适当的布局。这里重要的是,没有一种布局会做你想做的一切。您将需要学习利用每个布局的优势(和劣势)并利用它们来发挥自己的优势。这就是通常所说的“复合布局”。查看Laying Out Components Within a Container了解更多详情和想法

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel label;
        private JSlider slider;

        public TestPane() {
            label = new JLabel("Look, no hands!");
            setLayout(new BorderLayout());
            JPanel panel = new JPanel(new GridBagLayout());
            panel.add(label);

            add(panel);

            slider = new JSlider(8, 96);
            add(slider, BorderLayout.SOUTH);

            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    Font font = label.getFont();
                    font = font.deriveFont((float)slider.getValue());
                    label.setFont(font);
                }
            });
            slider.setValue(8);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }

}

JLabel 出奇的精通,更改字体(文本/图标)会自动导致布局无效并自行请求重绘...

【讨论】:

  • 知道了!我应该根据要求使用布局。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2019-02-19
  • 2011-09-24
相关资源
最近更新 更多