Redimensione o componente de giro quando o conteúdo mudou dinamicamente
-
26-09-2019 - |
Pergunta
Eu tenho, o mesmo problema com dois componentes JTextfield e JComBobox, presumo que a solução que procuro resolvesse para todos os componentes.
Definei o tamanho dos componentes como padrão, assim seu tamanho se encaixa no conteúdo inicial que eu forneci a ele. Quando altero o conteúdo de um componente para exceder a região do componente, não consigo ver o texto inteiro e gostaria que meu componente redimensione para ajustar o texto.
Como posso conseguir isso?
Atualizar:
O pack () no quadro aumentou apenas o campo de texto, como posso fazer o mesmo e aumentar a caixa de combinação?
Atualizar:
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;
}
}
Isso funciona, não é muito eficiente, mas é um primeiro passo, é que não leva a imagem do botão em considerações de tamanho, então parte do texto ainda não é mostrada, mas o componente redimensiona, você tem alguma sugestão?
Adão.
Responda:
Isso fez o truque junto com um pacote (), não é necessária reavalidação.
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;
}
}
Certifique -se de projetar algo mais eficiente do que isso ...
Atualizar:
E não há necessidade do pacote ()!
Adão.
Solução
JComboBox
tem setPrototypeDisplayValue(Object)
Método usado para calcular a largura preferida do componente com base no comprimento do parâmetro. Tente isso.
E em vez de pack()
usar doLayout()
junto com alguns revalidate()
ou repaint()
Outras dicas
Faça um pacote () no quadro
Para redimensionar a caixa de combinação que você pode tentar:
comboBox.setModel( comboBox.getModel() );
Eu acredito que isso deve fazer com que o tamanho preferido da caixa combinada seja recalculado. Claro que você precisaria fazer o pacote () novamente.
Editar:
Adicionado um SSCCE simples que mostra que isso funciona:
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 );
}
}