ComboBox com popup auto-dimensionável

Projeto de comboBox onde o popup redimensiona de acordo com o maior texto da lista.

Classe que constrói nosso popup

import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;

public class SteppedComboBoxUI extends MetalComboBoxUI {

	protected ComboPopup createPopup() {
		BasicComboPopup popup = new BasicComboPopup(comboBox) {

			public void show() {
				Dimension popupSize = ((SteppedComboBox) comboBox)
						.getPopupSize();
				popupSize
						.setSize(popupSize.width,
								getPopupHeightForRowCount(comboBox
										.getMaximumRowCount()));
				Rectangle popupBounds = computePopupBounds(0,
						comboBox.getBounds().height, popupSize.width,
						popupSize.height);
				scroller.setMaximumSize(popupBounds.getSize());
				scroller.setPreferredSize(popupBounds.getSize());
				scroller.setMinimumSize(popupBounds.getSize());
				list.invalidate();

				int selectedIndex = comboBox.getSelectedIndex();
				if (selectedIndex == -1) {
					list.clearSelection();
				} else {
					list.setSelectedIndex(selectedIndex);
				}
				list.ensureIndexIsVisible(list.getSelectedIndex());
				setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled());

				show(comboBox, popupBounds.x, popupBounds.y);
			}
		};
		popup.getAccessibleContext().setAccessibleParent(comboBox);
		return popup;
	}
}

Classe que constrói nosso combobox

import java.awt.Dimension;
import java.awt.FontMetrics;
import java.util.Collections;
import java.util.Vector;

import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class SteppedComboBox extends JComboBox<Object> {

	private static final long serialVersionUID = 1L;
	protected int popupWidth;

	public SteppedComboBox(int widthPopup) {
		super(Collections.EMPTY_LIST.toArray());
		setUI(new SteppedComboBoxUI());
		popupWidth = 0;
		setPopupWidth(widthPopup);
	}

	public SteppedComboBox(ComboBoxModel aModel) {
		super(aModel);
		setUI(new SteppedComboBoxUI());
		popupWidth = 0;
	}

	public SteppedComboBox(final Object[] items) {
		super(items);
		setUI(new SteppedComboBoxUI());
		popupWidth = 0;
	}

	public SteppedComboBox(Vector items) {
		super(items);
		setUI(new SteppedComboBoxUI());
		popupWidth = 0;
	}

	public void setPopupWidth(int width) {
		popupWidth = width;
	}

	public Dimension getPopupSize() {
		Dimension size = getSize();
		if (popupWidth < 1)
			popupWidth = size.width;

		for (int i = 0; i < super.getItemCount(); i++) {
			FontMetrics font = getGraphics().getFontMetrics();
			if (font.stringWidth(super.getItemAt(i).toString()) > popupWidth) {
				popupWidth = font.stringWidth(super.getItemAt(i).toString());
			}
		}
		return new Dimension(
				(size.getWidth() > popupWidth ? (int) size.getWidth()
						: (int) popupWidth), size.height);
	}

}

Classe que testa o combo

import javax.swing.JFrame;

public class main {

	//Teste do componente
	public static void main(String[] args) {

		SteppedComboBox comboBox = new SteppedComboBox(
				new String[] { "Teste1", "Testando combo box customizado popupWidth automático:)" });
		comboBox.setSize(100, 20);
		
		JFrame frame = new JFrame("ComboBox");
		frame.setSize(400, 100);
		frame.setLayout(null);
		frame.add(comboBox);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);

	}

}

downloadDownload do exemplo


Acesse
Cursos e Projetos
Java
Acesse
Outros Cursos
PHP MySQL Android
Acesse
Encomende um Projeto
Feito pra Você
Acesse
Tire as Dúvidas On-line
Consultor
Acesse
Aulas de Java só suas
Encomende Agora
Acesse
Dividindo Conhecimento
Posts e Tutoriais
Acesse
Sites e Parceiros
Associados
Acesse
Conheça os curso gratuitos
Grátis

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Instrutor Java Quer se tornar aluno VIP? CLIQUE AQUI!
Instrutor Java

Alex Fernando Egidio
Autor, criador e fundador do Java Avançado Cursos TI. Atua no mercado como desenvolvedor e engenheiro de sistemas em Java é apaixonado por desenvolvimento web em Java e pela “mágica” que seus frameworks trazem para o dia a dia de nós desenvolvedores.
Com mais de 10 anos de experiência ajuda programadores do Brasil todo a se tornarem profissionais.