使 AWT 窗口适应其子窗口的大小

问题描述 投票:0回答:1

我希望框架随着标签文本长度的变化而自动扩展和收缩(也就是说,如果它比必要的更宽则收缩,如果它变得太窄则扩展)

如何实现?

package panelDemo;

import org.apache.commons.lang3.StringUtils;

import javax.swing.*;
import java.awt.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Panel Demo");
        JPanel labelPanel = new JPanel();
        labelPanel.setBackground(Color.LIGHT_GRAY);
        String shortText = "Label text";
        JLabel label = new JLabel(shortText);
        label.setOpaque(true);
        label.setBackground(Color.DARK_GRAY);
        label.setForeground(Color.WHITE);
        labelPanel.add(label);
        frame.add(labelPanel);
        JButton makeShortButton = new JButton("Make short");
        makeShortButton.addActionListener(e -> label.setText(shortText));
        JButton makeLongButton = new JButton("Make long");
        String longText = "Long" + StringUtils.repeat(" long", 30) + " label text";
        makeLongButton.addActionListener(e -> label.setText(longText));
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(makeShortButton);
        buttonPanel.add(makeLongButton);
        frame.add(buttonPanel, BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

enter image description here

重要:

我不能依赖

frame.getPreferredSize()
,因为首选大小保留在 XML 文件中,并且可能比所需的更宽(创建并显示窗口后,将读取该值并将其设置为
preferredSize
属性)。所以这并没有按预期工作

                frame.setSize(getPreferredSize());
                frame.revalidate();
                frame.repaint();
java swing
1个回答
0
投票

只需在处理程序中的框架上调用

pack

makeLongButton.addActionListener(e -> { label.setText(longText); frame.pack(); });
© www.soinside.com 2019 - 2024. All rights reserved.