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

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

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

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

Обновление:

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

}

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

Обновление:

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

Адам.

1
задан TacB0sS 1 September 2010 в 22:35
поделиться

2 ответа

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

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

1
ответ дан 2 September 2019 в 21:40
поделиться

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

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

}
0
ответ дан 2 September 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: