[RESOLVIDO]Personalizar JComboBox

3 respostas
rissato

Olá, tenho um JComboBox, até o momento normal, com uma lista de produtos (nomes). Eu gostaria de colocar em cada linha (no canto direito, e se possível de outra cor), um JLabel (ou algo parecido) com o preço do produto. No caso do meu projeto atual, esse “JLabel” vai exibir o preço referente ao produto da respectiva linha do JComboBox, mas eu creio que essa idéia pode ser bem útil para exibir qualquer informação adicional sobre os ítens de um JComboBox. Alguém tem alguma idéia de como começar? Ou qual componente interno do JComboBox eu devo editar? Qualquer informação ajuda. Muito Obrigado.

3 Respostas

Roger75

Numa empresa em que eu trabalhei havia uma situação parecida. Se me recordo bem colocaram uma JList com uma JTable dentro, sendo que você colocaria a informação do preço numa segunda coluna da JTable.

Mas lembro que deu um trabalhão de implementar a parte de fazer scrolling quando havia muitos itens.

Não tenho o código desta implementação comigo, mas fica aí a idéia pra você pesquisar mais a fundo.

rissato

Já consegui fazer mexendo no ComboBoxRenderer. Agora estou com um problema quanto ao ComboBoxEditor, pois o meu ComboBox é editável. Quando eu terminar tudo, posto um mini-tutorial aqui. Valew!

rissato

Pronto. Pra fazer isso eu criei um JComponent chamado rLabel que possui 2 JLabels internos. Esse rLabel é usado para implementar a interface ListCellRenderer responsável por desenhar cada linha da JList interna do JComboBox. As classes estão abaixo:

public class rComboxRenderer extends rLabel implements ListCellRenderer {
	
	public rComboxRenderer(rCombox combo) {
		super();
		setOpaque(true);
		setPreferredSize(new Dimension(getWidth(), 22));
		setWidth(combo.getWidth());
	}
	
	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
		if (isSelected) {
			setBackground(list.getSelectionBackground());
			setForeground(list.getSelectionForeground());
		} else {
			setBackground(list.getBackground());
			setForeground(list.getForeground());
		}
		String str[] = value.toString().split("#");
		setText(rLabel.LABEL1, str[0]);
		setText(rLabel.LABEL2, str[1]+" ");
		return this;
	}
	
}
public class rLabel extends JComponent {
	public static final int LABEL1 = 0;
	public static final int LABEL2 = 1;
	JLabel label1, label2;
	public rLabel() {
		setBounds(0, 0, getWidth(), 22);
		label1 = new JLabel();
		label2 = new JLabel();
		label2.setHorizontalAlignment(SwingConstants.RIGHT);
		this.add(label1);
		this.add(label2);
	}
	public void setWidth(int l) {
		this.setBounds(0, 0, l, 22);
		label1.setBounds(0, 0, (l-50), 22);
		label2.setBounds(l-50, 0, 50, 22);
	}
	public void setText (int i, String t) {
		if (i==LABEL1) {
			label1.setText(t);
		}
		if (i==LABEL2) {
			label2.setText(t);
		}
	}
	public void setFontColor (int i, Color cor) {
		if (i==LABEL1) {
			label1.setForeground(cor);
		}
		if (i==LABEL2) {
			label2.setForeground(cor);
		}
	}
	public void setOpaque(boolean op) {
		label1.setOpaque(op);
		label2.setOpaque(op);
	}
}
Criado 1 de agosto de 2006
Ultima resposta 2 de ago. de 2006
Respostas 3
Participantes 2