Substituir lista da JComboBox

Ai, ai… Swing as vezes dah cada chapéu :frowning:

Seguinte: eu queria fazer uma JComboBox que, ao inves de abrir aquela listinha sem-graca (que, no fundo no fundo eh uma JList dentro de um javax.swing.plaf.ComboPopup), me abrisse uma tabela (ou seja, JTable dentro do ComboPopup).

So que tem um probleminha: a documentacao sobre o ComboPopup eh praticamente nula, e eu tou com aquela impressao de que nao eh isso que eu devia estar fazendo…

Resumindo, eu quero um resultado mais ou menos assim:

[code] -------------------
| 13 |+|

|Codigo | Nome |A|
|----------------------|-|
|13512 | Fulano | |
|13456 | Beltrano ||
|13748 | Ciclano |X|
|13748 | Berenice |-|
|13435 | Bartolomeu | |
|13978 | Zoroastro | |
|13800 | Zulmira | |
|13965 | Joaquina |
|
|13798 | Clodomiro |V|
------------------------[/code]

Pq você não implementa um ListCellRenderer?
Ele deve implementar um método

Implementa um modelo de lista e o renderer, que deve devolver o seu JTable.

Deve funcionar.

Faiou, dango! :frowning:

O ListCellRenderer renderiza, erhm… uma JTable por celula da JList interna da JComboBox! Pelo jeito, nao tem um jeito bom de se fazer isso… merda :?

Da uma olhada nesse link que talvez te ajude em alguma coisa
http://www2.gol.com/users/tame/swing/examples/SwingExamples.html

Ai vai CV, ve se te ajuda

TablePopupComboFrame

[code]
import java.awt.;
import javax.swing.
;

public class TablePopupComboFrame extends JFrame {
JPanel jPanel1 = new JPanel();
JComboBox combo = new JComboBox();

public TablePopupComboFrame() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
combo.addItem("one");
combo.addItem("two");
combo.addItem("three");
combo.addItem("four");

combo.setUI(new MyComboUI());
}

public static void main(String[] args) {
TablePopupComboFrame f = new TablePopupComboFrame();
f.pack();
f.setLocation(300,300);
f.show();
}
private void jbInit() throws Exception {
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel1.add(combo, null);
}
}[/code]
MyComboUI

[code]
import javax.swing.;
import javax.swing.plaf.basic.
;

public class MyComboUI extends BasicComboBoxUI {

protected ComboPopup createPopup() {

return new TableComboPopup(comboBox, this);
}
public JList getList()
{
return listBox;
}
} [/code]
TableComboPopup

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.basic.*;
import javax.swing.table.*;

public class TableComboPopup extends BasicComboPopup implements ListSelectionListener, ItemListener
{

private JList list = new JList();
private JComboBox combo;
private MyComboUI ui;
private PopupTableModel tm ;
private final JTable table;
private JScrollPane pane;

public TableComboPopup(JComboBox combo, MyComboUI ui)
{
super(combo);
this.combo = combo;
this.ui = ui;
tm = new PopupTableModel();
table = new JTable(tm);
pane = new JScrollPane(table);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(this);
combo.addItemListener(this);
}

public void show()
{
System.out.println("show called ");
super.removeAll();
tm.fireTableStructureChanged();
Dimension dim = new Dimension(combo.getPreferredSize().width,ui.getList().getPreferredScrollableViewportSize().height);
pane.setPreferredSize(dim);
super.add(pane);
selectRow();
super.show();
}
private void selectRow()
{
int index = combo.getSelectedIndex();
System.out.println("selecting row in table: "+index);
if (index == -1) return;
table.setRowSelectionInterval(index,index);
}

public void valueChanged(ListSelectionEvent e) {
combo.setSelectedIndex(table.getSelectedRow());
}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == e.DESELECTED) return;
table.getSelectionModel().removeListSelectionListener(this);
selectRow();
table.getSelectionModel().addListSelectionListener(this);
}

private class PopupTableModel extends AbstractTableModel
{
public int getColumnCount()
{
return 1;
}
public int getRowCount()
{
return combo.getItemCount();
}
public String getColumnName(int columnIndex)
{
return "Items";
}
public boolean isCellEditable(int row, int col)
{
return false;
}
public Object getValueAt(int r,int c)
{
return combo.getItemAt(r);
}
}
}

SHOW! Funcionou :smiley: 8) :lol: :twisted:

Desculpem por ressuscitar esse topico, mas eu nao conseguir colocar as colunas no combo… alguem tem uma dica de como eu posso fazer ou se tem outra forma?

Dorivan,

Blz?
Tb n consegui n, com esse exemplo aí, ele mostra apenas uma coluna… tendi n.

O que acho estranho no Java é isso, esse prob aí foi postado em 2003, 6 anos dpois
tá vc, eu e muitos outros querendo desenvolver uma solução q já poderia estar incluída
no Java, afinal, 6 anos se passaram e isso continua igual, é fogo…

Se conseguir, dá um alô pra nóis :), vou continuar futucando por aki tb.

Falew.

eu encontrei o OpenSwing ele tem um ComboBoxVO que tem a opcao de colocar duas colunas…

Já testou?

sim, ja testei, as colunas funcionam. agora faltou um detalhe do search pra ir digitando e ir localizando q eu ainda nao descobrir como fazer funcionar… tem esse exemplo pra baixar nesse endereço http://sugik.do-event.com/?p=45 mas se quiser o fonte direto http://www.ziddu.com/download/5420002/mbahsomoComboSource.rar.html

Pô Dorivan, valeu…

Eu vou dar uma saída agora, outro turno, outro trabalho *r,
chegando vou futucar e te falo o q eu consegui fazer tb…

Hm, vi alguns exemplos, mas ainda n é o q eu queria.
Queria q meu Combo tivesse, por ex., 2 colunas “id, nome” e exibisse as duas ou uma coluna, mas
no campo só mostrasse um único valor “nome”, e qdo fosse pegar o valor do combo, q o “id” fosse
selecionado.

Vi uns componentes legais da www.eltima.com, mas custa quase R$ 200,00 :slight_smile:

mas essa combo faz isso, basta vc mandar ocultar a coluna do id

Hm, então n entendi ele, vou dar uma olhada agora de novo.

E aew CV, então sou outro que está ressucitando o post mais to com uma duvida,

funcionaou bacana aqui, tá indo com 2 colunas certinho, mais o meu problema é na hora de adicionar os Items, tá indo o mesmo Item para as duas colunas

Ex:

-----------------------------
| Item 01                   |+|
-----------------------------
|Código  |Nome             |
-----------------------------
|Item 01 |Item 01          |
|Item 02 |Item 02          |
-----------------------------

não consigo inserir como você diz neste exemplo:

  -------------------  
 | 13             |+|  
 -----------------------  
 |Codigo | Nome      |
 |---------------------- 
 |13512  | Fulano       
 |13456  | Beltrano    
 |13748  | Ciclano      
 |13748  | Berenice    
 |13435  | Bartolomeu
 |13978  | Zoroastro  
 |13800  | Zulmira     
 |13965  | Joaquina    
 |13798  | Clodomiro  
 ------------------------  

se você ou alguem puder me ajudar agradeço!

ahh… a maneira que estou tentando colocar os itens no jComboBox é com o addItem() mesmo

Obrigado e Abraço