我想通过JLabel
将setPreferredSize()
的大小设置为特定(最小)尺寸。
如果JLabel
内的文字不再适合,JLabel
应该会增长。
现在的问题是:
label.setPreferredSize(new Dimension(50,20));
setText("new long text");
但尺寸不会改变import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class LabelTest
{
public static void createWindow()
{
JFrame frame = new JFrame();
JLabel label = new JLabel("Text");
System.out.println(label.getPreferredSize().width); // 25
label.setText("New long text");
System.out.println(label.getPreferredSize().width); // 77 - JLabel grows as expected
label.setText("Text");
System.out.println(label.getPreferredSize().width); // 25
label.setPreferredSize(new Dimension(50, 20));
System.out.println(label.getPreferredSize().width); // 50 - JLabel grows to given size as expected
label.setText("New long text");
System.out.println(label.getPreferredSize().width); // 50 - it should be 77 again
frame.add(label);
frame.setPreferredSize(new Dimension(200, 100));
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createWindow();
}
});
}
}
所以我需要一个解决方案,以便在我手动设置首选大小后设置文本时获得新的首选大小。
如果您需要更多信息,请询问。
提前致谢!
答案 0 :(得分:2)
使用LayoutManager可以达到想要的效果 下面是GridBag Layout
的示例public class GridBagExample extends JFrame {
private JPanel contentPane;
private JLabel lblMyLabel;
private JTextField textField;
private JButton btnChangeMyLabel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
GridBagExample frame = new GridBagExample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public GridBagExample() {
initComponents();
}
private void initComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 94);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[] { 0, 344, 0 };
gbl_contentPane.rowHeights = new int[] { 0, 0, 0 };
gbl_contentPane.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
gbl_contentPane.rowWeights = new double[] { 1.0, 1.0, Double.MIN_VALUE };
contentPane.setLayout(gbl_contentPane);
lblMyLabel = new JLabel(" My Label");
GridBagConstraints gbc_lblMyLabel = new GridBagConstraints();
gbc_lblMyLabel.insets = new Insets(0, 0, 5, 5);
gbc_lblMyLabel.anchor = GridBagConstraints.EAST;
gbc_lblMyLabel.gridx = 0;
gbc_lblMyLabel.gridy = 0;
contentPane.add(lblMyLabel, gbc_lblMyLabel);
textField = new JTextField();
GridBagConstraints gbc_textField = new GridBagConstraints();
gbc_textField.insets = new Insets(0, 0, 5, 0);
gbc_textField.fill = GridBagConstraints.HORIZONTAL;
gbc_textField.gridx = 1;
gbc_textField.gridy = 0;
contentPane.add(textField, gbc_textField);
textField.setColumns(10);
btnChangeMyLabel = new JButton("Change My Label");
btnChangeMyLabel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
lblMyLabel.setText("This is the new text of my JLabel");
}
});
GridBagConstraints gbc_btnChangeMyLabel = new GridBagConstraints();
gbc_btnChangeMyLabel.gridwidth = 2;
gbc_btnChangeMyLabel.gridx = 0;
gbc_btnChangeMyLabel.gridy = 1;
contentPane.add(btnChangeMyLabel, gbc_btnChangeMyLabel);
}
希望它有所帮助。
答案 1 :(得分:0)
要设置最小尺寸,请使用setMinimumSize(Dimension)
。在大多数情况下,最好将JLabel
放在具有合适布局管理器的容器中,并在其上设置大小。
自动计算getPreferredSize()
的返回值,直到您设置明确的首选大小。在此之后,getPreferredSize()
将以此特定大小返回。如果您重置首选大小(通过将其设置为null
),则可以再次使用自动大小。在你的情况下:
label.setText("Text");
System.out.println(label.getPreferredSize().width); // 25
label.setPreferredSize(new Dimension(50, 20));
System.out.println(label.getPreferredSize().width); // 50
label.setText("New long text");
System.out.println(label.getPreferredSize().width); // 50
label.setPreferredSize(null);
System.out.println(label.getPreferredSize().width); // 77