内容动态更改时调整Swing组件的大小

时间:2010-09-01 06:39:32

标签: java swing autoresize

我有两个组件JTextField和JComboBox的相同问题,我假设我正在寻找的解决方案将为所有组件解决它。

我已将组件的大小设置为默认值,因此它们的大小适合我提供给它的初始内容。当我更改组件的内容超出组件的区域时,我看不到整个文本,我希望我的组件调整大小以适应文本。

我该如何实现?

更新

框架上的pack()只放大了文本字段,我该怎么办呢?放大组合框?

更新

    private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
    private static final long serialVersionUID = 752379460716217273L;
    Dimension maxSize=new Dimension();
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText(value.toString());
        Dimension size = getPreferredSize();
        if(maxSize.width<size.width)
            maxSize.width=size.width;
        if(maxSize.height<size.height)
            maxSize.height=size.height;

        resolutionDescriptor_ComboBox.setPreferredSize(maxSize);
        return this;
    }

}

这个工作,效率不是很高,但这是第一步,事实是,它不会将按钮图像考虑到大小,所以有些文本仍未显示,但组件调整大小,你有没有建议?

亚当。

答案:

这与包()一起完成了这个技巧,不需要重新验证。

    private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
    private static final long serialVersionUID = 752379460716217273L;
    Dimension maxSize=new Dimension();
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText(value.toString());
        Dimension size = getPreferredSize();
        if(maxSize.width<size.width) {
            maxSize.width=size.width;
            resolutionDescriptor_ComboBox.setPrototypeDisplayValue(value.toString());
        }
        if(maxSize.height<size.height)
            maxSize.height=size.height;

        return this;
    }

}

确保你设计出比这更有效的东西...

更新

并且不需要包()!

亚当。

3 个答案:

答案 0 :(得分:1)

在框架上做一个包()

答案 1 :(得分:1)

JComboBox具有setPrototypeDisplayValue(Object)方法,该方法用于根据参数的长度计算组件的首选宽度。试试吧。

而不是pack()doLayout()revalidate()repaint()

一起使用

答案 2 :(得分:0)

要调整组合框的大小,您可以尝试:

comboBox.setModel( comboBox.getModel() );

我认为这会导致重新计算组合框的首选大小。当然,您需要再次执行pack()。

编辑:

添加了一个显示此功能的简单SSCCE:

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

public class ComboBoxTest3 extends JFrame implements ActionListener
{
    JComboBox comboBox;
    JTextField textField;

    public ComboBoxTest3()
    {
        String[] tabs = {"one", "two", "three", "four", "five", "six", "seven" };
        DefaultComboBoxModel model = new DefaultComboBoxModel(tabs);
        comboBox = new JComboBox( model );

        textField = new JTextField("hello");

        add(comboBox, BorderLayout.WEST );
        add(textField, BorderLayout.EAST );

        JButton button = new JButton("Pack");
        button.addActionListener( this );
        add(button, BorderLayout.SOUTH);
    }

    public void actionPerformed(ActionEvent e)
    {
        textField.setText("hello there!");
        comboBox.addItem("some longer text");
        comboBox.setModel( comboBox.getModel() );
        pack();
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxTest3();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }

}