Изменение размера компонента Swing при динамическом изменении содержимого

У меня та же проблема с двумя компонентами JTextField и JComboBox, я предполагаю, что решение, которое я ищу, решит ее для всех компонентов.

Я установил размер компонентов по умолчанию, поэтому их размер соответствует исходному содержимому, которое я ему предоставил. когда я изменяю содержимое компонента так, чтобы оно превышало область компонента, я не вижу весь текст, и я хотел бы, чтобы размер моего компонента изменялся, чтобы соответствовать тексту.

Как я могу это сделать?

Обновление:

Пакет () на рамке только увеличил текстовое поле, как я могу сделать то же самое и увеличить поле со списком?

Обновление:

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

}

убедитесь, что вы разрабатываете что-то более эффективное, чем это...

Обновление:

и в пакете () нет необходимости!

Адам.


person TacB0sS    schedule 01.09.2010    source источник
comment
В Swing размер компонентов зависит от компоновки их контейнера. Какой макет вы используете?   -  person Istao    schedule 01.09.2010
comment
Не очень хорошее решение. Вы никогда не должны устанавливать/изменять свойство компонента Swing в средстве визуализации.   -  person camickr    schedule 01.09.2010
comment
почему это не хорошее решение? потому что он будет проходить код каждый раз, когда фрейм получает фокус, и цикл будет выполняться для каждого элемента в списке, вы это имеете в виду?   -  person TacB0sS    schedule 02.09.2010


Ответы (3)


JComboBox имеет setPrototypeDisplayValue(Object) метод, который используется для расчета предпочтительной ширины компонента на основе длины параметра. Попробуй это.

И вместо pack() используйте doLayout() вместе с некоторыми revalidate() или repaint()

person Denis Tulskiy    schedule 01.09.2010
comment
pack() является правильным методом для использования. Вы не должны использовать doLayout(). doLayout может увеличить размер компонентов, но размер фрейма не изменится, поэтому компоненты будут усечены. - person camickr; 01.09.2010
comment
нет необходимости использовать пакет или doLayout, он отлично работает и без них - person TacB0sS; 02.09.2010

Сделайте пакет () на кадре

person Maurice Perry    schedule 01.09.2010

Чтобы изменить размер поля со списком, вы можете попробовать:

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

}
person camickr    schedule 01.09.2010
comment
Нет, ничего не изменилось, все осталось по-прежнему... Я добавил это перед пакетом(), который пробовал ранее. Возможно, я настрою свой собственный рендерер и определю для него новый размер в соответствии с самым большим компонентом в списке... Я посмотрю, как это работает. - person TacB0sS; 01.09.2010