Java JLabel:手动设置PreferredSize,但在设置文本之后设置getPreferredSize

Java JLabel:手动设置PreferredSize,但在设置文本之后设置getPreferredSize,java,swing,jlabel,settext,Java,Swing,Jlabel,Settext,我想通过setPreferredSize()将JLabel的大小设置为特定(最小)大小。 如果JLabel中的文本不再适合,则JLabel应该增长 现在的问题是: 在label.setPreferredSize(新尺寸(50,20))之后 我做setText(“新长文本”)但大小不会改变 导入java.awt.Dimension; 导入javax.swing.JFrame; 导入javax.swing.JLabel; 导入javax.swing.SwingUtilities; 导入javax

我想通过
setPreferredSize()
JLabel
的大小设置为特定(最小)大小。 如果
JLabel
中的文本不再适合,则
JLabel
应该增长

现在的问题是:

  • label.setPreferredSize(新尺寸(50,20))之后
  • 我做
    setText(“新长文本”)但大小不会改变
导入java.awt.Dimension;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.SwingUtilities;
导入javax.swing.WindowConstants;
公共类标签测试
{
公共静态void createWindow()
{
JFrame=新JFrame();
JLabel标签=新的JLabel(“文本”);
System.out.println(label.getPreferredSize().width);//25
label.setText(“新长文本”);
System.out.println(label.getPreferredSize().width);//77-JLabel按预期增长
label.setText(“文本”);
System.out.println(label.getPreferredSize().width);//25
标签。设置首选尺寸(新尺寸(50,20));
System.out.println(label.getPreferredSize().width);/50-JLabel按预期增长到给定的大小
label.setText(“新长文本”);
System.out.println(label.getPreferredSize().width);//50-它应该又是77
框架。添加(标签);
frame.setPreferredSize(新尺寸(200100));
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
公共静态void main(字符串[]args)
{
SwingUtilities.invokeLater(新的Runnable()
{
公开募捐
{
createWindow();
}
});
}
}
因此,我需要一个解决方案,以获得新的首选大小时,文本设置后,我已经手动设置了首选大小

如果你需要更多的信息,尽管问


提前谢谢

您可以使用LayoutManager获得所需内容
下面是GridBag布局的示例

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);
    }

希望有帮助。

要设置最小尺寸,请使用
设置最小尺寸(尺寸)
。在大多数情况下,最好将
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

因此,实际上,您希望能够覆盖getMinimumSize()。。。Hmmm.unrelated:一旦调用setPreferredSize(),标签的大小将不再动态更改。您需要使用setPreferredSize(null)。更好的选择是使用尊重最小/首选尺寸的布局管理器,如BoxLayout或GrigBagLayout。谢谢@camickr!SetPreferedSize(null)正是我在这个案例中所需要的,尽管我知道LayoutManager会更好!