2016-04-29 13 views
1

Ich rendere eine JTable mit bestimmten Zellen, die eine normale Texteingabe oder eine ComboBox sind.Wie mache ich JTable mit mehreren Editor-Typen hintereinander?

Wenn ich versuche, es wie folgt aus:

package sandbox.jtablegui; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.Hashtable; 

import javax.swing.*; 
import javax.swing.table.*; 

public class App extends JFrame 
{ 
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3); 

    public App() 
    { 
     String[] colNames = { "Name", "Value" }; 
     final String[] propertyNames = { "Val1", "Val2" }; 
     DefaultTableModel model = new DefaultTableModel(colNames, 2) { 

      // set setting names 
      public Object getValueAt(int row, int col) { 
       if (col == 0) 
        return propertyNames[row]; 
       return super.getValueAt(row, col); 
      } 

      public boolean isCellEditable(int row, int col) { 
       if (col == 0) 
        return false; 
       return true; 
      } 
     }; 

     JComboBox<String> comboBox = new JComboBox<String>(new String[] { "Option1", "Option2" }); 
     final DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox) { 
      @Override 
      public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
       Object val = value; 
       System.out.println(val); 
       if (val == null) { 
        val = ((JComboBox<?>) getComponent()).getItemAt(0); 
        System.out.println(val); 
       } 
       return super.getTableCellEditorComponent(table, val, isSelected, row, column); 
      } 
     }; 

     JTable table = new JTable(model) 
     { 
      // Determine editor to be used by row 
      public TableCellEditor getCellEditor(int row, int column) 
      { 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1 && row == 1) 
        return comboBoxEditor; 
       else 
        return super.getCellEditor(row, column); 
      } 
     }; 
     RowEditorModel rowEditorModel = new RowEditorModel(); 



     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     App frame = new App(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public class RowEditorModel { 
     private Hashtable data; 

     public RowEditorModel() { 
      data = new Hashtable(); 
     } 

     public void addEditorForRow(int row, TableCellEditor editor) { 
      data.put(new Integer(row), editor); 
     } 

     public void removeEditorForRow(int row) { 
      data.remove(new Integer(row)); 
     } 

     public TableCellEditor getEditor(int row) { 
      return (TableCellEditor) data.get(new Integer(row)); 
     } 
    } 
} 

Allerdings ist der Standardwert nicht in der JTable gezeigt, wie Sie aus dem Screenshot sehen.

enter image description here

+1

bitte was Problem ist folgende officia Oracle-Tutorial, wie scheint, als RowEditorModel nicht abgeschlossen ist, gibt Bündel bessere Möglichkeiten sind (auf einen Wert an die XxxTableModel Speicherung) – mKorbel

+0

ja, entdecken jetzt, dass die tablemodel sollte die Werte zB verwalten http://stackoverflow.com/questions/11858286/how-to-use-custom-jtable-cell-editor-and-cell-renderer? – poseid

Antwort

2

Einstellung des ausgewählten Index auf Combobox Schöpfung kann nicht helfen. Sie müssen es jedes Mal einstellen, wenn es als Editor verwendet wird. Etwas wie folgt aus:

DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox) { 
    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     Object val = value; 
     if (val == null) { 
      val = ((JComboBox<?>) getComponent()).getItemAt(0); 
     } 
     return super.getTableCellEditorComponent(table, val, isSelected, row, column); 
    } 

} 
+0

danke, hmm .. wann wird getTableCellEditorComponent aufgerufen? Ich versuche das ausgewählte Optoin mit System.out.println (val) zu sehen; aber es gibt kein Zeichen, dass die Funktion aufgerufen wird ... – poseid

+0

Diese Methode wird jedes Mal von JTable aufgerufen, wenn die Tabelle den Editor zum Anzeigen vorbereitet. Wenn meine Lösung keine Auswirkungen hat, geben Sie bitte eine [SSCCE] (http://sscce.org) an, damit ich sehen kann, was nicht stimmt. –

+1

@psid Editor wird nur angezeigt, wenn eine bearbeitbare Zelle einer Tabelle vom Benutzer angeklickt wird. Wenn Sie es in der Tabelle sehen wollen, müssen Sie es in 'getValueAt()' Methode Ihres Modells zurückgeben. –

Verwandte Themen