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

Java 内容动态更改时调整Swing组件的大小,java,swing,autoresize,Java,Swing,Autoresize,对于两个组件JTextField和jcombox,我有相同的问题,我认为我正在寻找的解决方案可以解决所有组件的问题 我已经将组件的大小设置为默认值,因此它们的大小适合我提供给它的初始内容。当我将组件的内容更改为超出组件的区域时,我看不到整个文本,我希望我的组件调整大小以适应文本 我怎样才能做到这一点 更新: private class ComboBoxRenderer extends JLabel implements ListCellRenderer { private sta

对于两个组件JTextField和jcombox,我有相同的问题,我认为我正在寻找的解决方案可以解决所有组件的问题

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

我怎样才能做到这一点

更新:

    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;
        if(maxSize.height<size.height)
            maxSize.height=size.height;

        resolutionDescriptor_ComboBox.setPreferredSize(maxSize);
        return this;
    }

}
私有类ComboBoxRenderer扩展JLabel实现ListCellRenderer{
私有静态最终长serialVersionUID=752379460716217273L;
维度maxSize=新维度();
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
setText(value.toString());
维度大小=getPreferredSize();

如果(maxSize.width在框架上执行一个pack()

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

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

}

JComboBox
有一种方法,用于根据参数的长度计算组件的首选宽度。请尝试


使用
doLayout()
和一些
revalidate()
repaint()代替
pack()

在swing中,组件的大小取决于其容器的布局。您使用什么布局?这不是一个好的解决方案。您永远不应该在渲染器中设置/更改swing组件的属性。为什么这不是一个好的解决方案?因为它会在每次帧接收到焦点时遍历代码,并且循环将对每个项目执行在列表中,这就是你的意思吗?不,没有改变,它保持不变…我在我之前尝试的pack()之前添加了这个。也许可以设置我自己的渲染器,并根据列表中最大的组件为它定义新的大小…我会看到它是如何工作的。pack()是正确的使用方法。你不应该使用doLayout().doLayout可能会增加组件的大小,但框架大小不会改变,因此组件将被截断。不需要使用包或doLayout,没有它们也可以正常工作