Изменение размера качающего компонента, когда содержание изменилось динамически

StackOverflow https://stackoverflow.com/questions/3615573

  •  26-09-2019
  •  | 
  •  

Вопрос

У меня та же проблема с двумя компонентами 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;
    }

}

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

Адам.

Отвечать:

Это сделала трюк вместе с пакетом (), не нужна повторная проверка.

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

}

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

Обновлять:

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

Адам.

Это было полезно?

Решение

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

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

Другие советы

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

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

comboBox.setModel( comboBox.getModel() );

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

Редактировать:

Добавлен простой 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 );
     }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top