У меня та же проблема с двумя компонентами 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;
}
}
Убедитесь, что вы разработали что-то более эффективное, чем это ...
Обновление:
] и нет необходимости в пакете ()!
Адам.
JComboBox
имеет метод setPrototypeDisplayValue(Object)
, который используется для вычисления предпочтительной ширины компонента на основе длины параметра. Попробуй это.
И вместо pack()
используйте doLayout()
вместе с некоторым revalidate()
или repaint()
Чтобы изменить размер поля со списком, вы можете попробовать:
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 );
}
}