2009-01-19 13 views
14

Chcę umieścić poszczególne JComboBox w każdej komórce JTable. to znaczy. Zawartość JComboBox nie jest identyczna dla każdej komórki.Umieszczanie JComboBox w JTable

Po prostu chciałbym móc wywołać poniższy kod, aby dodać wiersz JComboBox do JTable. Ktoś ma jakiś pomysł? Dzięki

JComboBox cb1 = new JComboBox(...); 
JComboBox cb2 = new JComboBox(...); 
model.addRow(new Object[] {"Row name", cb1, cb2}); 

JComboBox cb3 = new JComboBox(...); 
JComboBox cb4 = new JComboBox(...); 
model.addRow(new Object[] {"Row name 2", cb3, cb4}); 

Najbliższy przykładowy kod, jaki mogę znaleźć, jest następujący. Ale to do tego, gdzie zawartość JComboBox jest identyczna dla pojedynczej kolumny. Nie jest to rozwiązanie, którego potrzebuję.

TableColumn col = table.getColumnModel().getColumn(vColIndex); 
col.setCellEditor(new MyComboBoxEditor(values)); 

gdzie

public class MyComboBoxEditor extends DefaultCellEditor { 
    public MyComboBoxEditor(String[] items) { 
     super(new JComboBox(items)); 
    } 
} 
+0

Bardzo proste: Stół .getColumnModel(). getColumn (2) .setCellEditor (nowy DefaultCellEditor (myComboBox)); gdzie możesz załadować myComboBox z twoimi wartościami. Nie potrzebujesz żadnej dodatkowej klasy! – Elmue

Odpowiedz

-8

Najprostszym sposobem jest wprowadzenie własnego TableModel

public class MyModel extends AbstractTableModel { 
    List rows; 

    public int getRowCount() { 
     return rows.size(); 
    } 

    public int getColumnCount() { 
     return 4; 
    } 

    public Object getValueAt(int row, int column) { 
     return rows.get(row).getCol(col); //assuming your row "Object" has a getCol() 
    } 

    public Class<?> getColumnClass(int col) { 
     return Boolean.class; 
    } 

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     rows.get(rowIndex).getCol(columnIndex).setValue(aValue); 
    } 

} 

załadować do ciebie JTable. Jeśli nie zastąpiłeś domyślnego renderera komórek dla wartości logicznych Boolean, wszystkie komórki będą renderowane jako pola wyboru dzięki implementacji metody getColumnClass(). Wszystkie dane wejściowe użytkownika do tych pól wyboru są gromadzone za pomocą naszej metody setValueAt().

+20

Err, zapytał o JComboBox, a nie JCheckBox. Jak ta odpowiedź została przyjęta? –

+0

@SarelBotha Ponieważ OP był ostatnio widziany w dniu 31 stycznia 2009 r., A poprawna odpowiedź pochodzi z 3 czerwca 2009 r. Najwyraźniej nikt nie myśli, że to jest problem. Zobacz [meta] (http://meta.stackexchange.com/questions/161946/rethinking-sort-order-of-answers). – PiTheNumber

0

This page może pomóc, choć wydaje się, jesteś ograniczony do posiadania tego samego combobox we wszystkich komórek w kolumnie.

2

Trzeba zastąpić:

Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 

... w TableCellEditor. Wartość przekazana do tej metody to wartość, którą możesz umieścić w swoim JComboBox. Oznacza to, że "wartość" dla tej konkretnej komórki musi być czymś, co można przetłumaczyć na kolekcję. Może to być po prostu Lista obiektów lub może to być POJO z polami, które mogą zostać przekształcone w JComboBox.

Po prostu edytuj MyComboBoxEditor, aby zastąpić tę metodę i zmienić model, aby umożliwić obiekt, który faktycznie reprezentuje kilka innych obiektów.

0

Musisz utworzyć podklasę JTable, aby nadpisać metodę TableCellEditor getCellEditor (int row, int column).

Umożliwia to ustawienie dowolnych edytorów komórek dla dowolnej kombinacji wierszy i kolumn. Domyślnym sposobem jest ustawienie edytora komórek dla całej kolumny.

(Można również ustawić indywidualne renderujące komórkowych nadrzędnymi getCellRenderer.)

9

Extend JTable z tym kodem:

@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    Object value = super.getValueAt(row, column); 
    if(value != null) { 
     if(value instanceof JComboBox) { 
      return new DefaultCellEditor((JComboBox)value); 
     } 
      return getDefaultEditor(value.getClass()); 
    } 
    return super.getCellEditor(row, column); 
} 

To stworzy unikalny edytor komórek JComboBox dla każdego pola kombi masz na wartość dla.

+3

+1 - należy również ustawić niestandardowy 'TableCellRenderer' na' TableColumnModel' w odpowiedniej kolumnie, aby upewnić się, że wybrana wartość jest narysowana zamiast ciągu 'javax.swing.JCombobox [...]' podczas gdy komórka nie jest edytowana. Ten 'TableCellRenderer' powinien zaimplementować' getTableCellRendererComponent (..) 'i może zwrócić' JLabel' z wartością 'JComboBox.getSelectedItem(). ToString()' (po sprawdzeniu wskaźników zerowych). –

1
@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    Object value = super.getValueAt(row, column); 
    if(value != null) { 
     if(value instanceof JComboBox) { 
      return new DefaultCellEditor((JComboBox)value); 
     } 
      return getDefaultEditor(value.getClass()); 
    } 
    return super.getCellEditor(row, column); 
} 

A potem zastąpić metodę toString z JComboBox.

+1

To faktycznie powtarza [inną odpowiedź] (http://stackoverflow.com/a/946949/572834), ale dodaje jeden punkt: użyj dostosowanego 'JComboBox', aby jego metoda' toString() 'zwróciła wybraną wartość. W takim przypadku możesz użyć domyślnej implementacji 'TableCellRenderer'. –

2

Jestem pewien, że to rozwiąże twój problem. Wspomnij, w której kolumnie musisz ustawić pole kombi w.getColumn (int kolumna)

private void addComboToTable(JComboBox combo) { 
    TableColumn gradeColumn = YourTable.getColumnModel().getColumn(0); 
    JComboBox comboBox = combo; 
    comboBox.removeAllItems(); 
    try { 
     comboBox.addItem("Item 1"); 
     comboBox.addItem("Item 2"); 
     comboBox.addItem("Item 3"); 
    } catch (NullPointerException e) { 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    gradeColumn.setCellEditor(new DefaultCellEditor(comboBox)); 
} 
2

Zawartość JComboBox renderowania identyczne dla każdego rzędu, ponieważ wybór JTable nie zapewnia możliwość posiadania więcej niż jeden edytor na kolumnę. Należy rozszerzyć klasę JTable, aby obsługiwać dodatkowy wybór wierszy.

Ten artykuł wyjaśnia to bardzo dobrze: http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

2

Oprócz cellEditor trzeba zrobić CellRenderer pomalować combobox w komórce, spójrz na to:

public void example(){ 

     TableColumn tmpColum =table.getColumnModel().getColumn(1); 
     String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" }; 
     JComboBox comboBox = new JComboBox(DATA); 

     DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox); 
     tmpColum.setCellEditor(defaultCellEditor); 
     tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox)); 
     table.repaint(); 
    } 


/** 
    Custom class for adding elements in the JComboBox. 
*/ 
class CheckBoxCellRenderer implements TableCellRenderer { 
     JComboBox combo; 
     public CheckBoxCellRenderer(JComboBox comboBox) { 
      this.combo = new JComboBox(); 
      for (int i=0; i<comboBox.getItemCount(); i++){ 
       combo.addItem(comboBox.getItemAt(i)); 
      } 
     } 
     public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      combo.setSelectedItem(value); 
      return combo; 
     } 
    }