Изменение размера качающего компонента, когда содержание изменилось динамически
-
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 );
}
}