我希望框架随着标签文本长度的变化而自动扩展和收缩(也就是说,如果它比必要的更宽则收缩,如果它变得太窄则扩展)
如何实现?
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);
}
}
重要:
我不能依赖
frame.getPreferredSize()
,因为首选大小保留在 XML 文件中,并且可能比所需的更宽(创建并显示窗口后,将读取该值并将其设置为 preferredSize
属性)。所以这并没有按预期工作
frame.setSize(getPreferredSize());
frame.revalidate();
frame.repaint();
只需在处理程序中的框架上调用
pack
:
makeLongButton.addActionListener(e -> { label.setText(longText); frame.pack(); });