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.

Foi útil?

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top