【问题标题】:Resize Swing component when content has changed dynamically当内容发生动态变化时调整 Swing 组件的大小
【发布时间】:2011-04-06 15:30:30
【问题描述】:

我有,两个组件 JTextField 和 JComboBox 有同样的问题,我认为我正在寻找的解决方案可以解决所有组件的问题。

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

我怎样才能做到这一点?

更新:

frame 上的 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;
    }

}

这行得通,效率不是很高,但这是第一步,事情是,它没有考虑按钮图像的大小,所以一些文本仍然没有显示,但是组件调整大小,你有没有建议?

亚当。

答案:

这与 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;
            resolutionDescriptor_ComboBox.setPrototypeDisplayValue(value.toString());
        }
        if(maxSize.height<size.height)
            maxSize.height=size.height;

        return this;
    }

}

确保你设计的东西比这个更高效......

更新:

而且不需要 pack()!

亚当。

【问题讨论】:

  • 在 Swing 中,组件的大小取决于其容器的布局。你用什么布局?
  • 不是一个好的解决方案。永远不要在渲染器中设置/更改 Swing 组件的属性。
  • 为什么这不是一个好的解决方案?因为每次框架获得焦点时它都会遍历代码,并且循环会针对列表中的每个项目执行,这是您的意思吗?

标签: java swing autoresize


【解决方案1】:

在框架上做一个 pack()

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不,没有任何改变,它保持不变......我在之前尝试过的 pack() 之前添加了这个。也许设置我自己的渲染器并根据列表中最大的组件为其定义新的大小......我会看看它是如何工作的。
    【解决方案3】:

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

    而不是pack() 使用doLayout() 与一些revalidate() 或repaint() 一起使用

    【讨论】:

    • pack() 是正确的使用方法。你不应该使用 doLayout()。 doLayout 可能会增加组件的大小,但框架大小不会改变,因此组件会被截断。
    • 不需要使用 pack 或 doLayout,没有它们也可以正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多