2016-04-06 5 views
0

Ich bin die unten Zelle Fabrik auf eine Spalte anwenden.Tabelle Zelle Combobox - Aktion nicht durchgeführt

targetEnviroment.setCellFactory(new Callback<TableColumn<DevWorkTabBench, String>, TableCell<DevWorkTabBench, String>>() { 

       @Override 
       public TableCell<DevWorkTabBench, String> call(TableColumn<DevWorkTabBench, String> param) { 
        TableCell<DevWorkTabBench, String> cell = new TableCell<DevWorkTabBench, String>() { 
         @Override 
         public void updateItem(String item, boolean empty) { 
          super.updateItem(item, empty); 

          String status = null; 
          try { 
           status = getTableView().getItems().get(getIndex()).getObjectStatus(); 
          } catch (IndexOutOfBoundsException ex) { 
          status = ""; 
          } 
          if (status.equalsIgnoreCase("ReadyForDeployment")) { 

           ComboBox<String> comboBox = new ComboBox(environmentList); 
           comboBox.valueProperty().addListener(new ChangeListener<String>() { 

            @Override 
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
             commitEdit(newValue); 
            } 
           }); 

           comboBox.setOnShown(new EventHandler<Event>() { 
            @Override 
            public void handle(Event event) { 
             getTableView().edit(getIndex(), getTableColumn()); 
             getTableView().getSelectionModel().select(getIndex()); 

            } 
           }); 
           comboBox.setValue(item); 
           setGraphic(comboBox); 
          } else { 
           setGraphic(null); 
          } 

          if (empty) { 
           setGraphic(null); 

          } 
         } 
        }; 

        return cell; 
       } 

      }); 

Als ich die status auf den erwähnten Status zu ändern, habe ich den Blick von ComboBox in dieser bestimmten Zelle, aber die Drop-down nicht auftritt. Auch nach mehreren Klicks scheint keine Aktion auf dem combobox ausgeführt zu werden. Außer dem gehandhabten bekomme ich keine Ausnahme. Andere Spalten können bearbeitet werden und führen die Aufgabe wie erwartet aus.

Ich habe keine Ahnung, was hier falsch ist. Kann mir bitte jemand helfen.

Antwort

1

Da Sie das Kombinationsfeld immer in den (nicht leeren) Zellen anzeigen, müssen Sie nicht wirklich in den "Bearbeitungsmodus" gehen, wie es der Standard TextFieldTableCell tut. Ihre Implementierung ähnelt der CheckBoxTableCell, die den Editiermechanismus im Wesentlichen umgeht. Vom documentation for that class:

Beachten Sie, dass die CheckBoxTableCell die CheckBox ‚live‘ macht, was bedeutet, dass die CheckBox immer interaktiv ist und der Benutzer durch direkt umgeschaltet werden kann. Dies bedeutet, dass es nicht erforderlich ist, dass die Zelle ihren Bearbeitungsstatus eingibt (normalerweise durch Doppelklicken des Benutzers auf die Zelle). Ein Nebeneffekt hiervon ist, dass die üblichen Editierrückrufe (wie unter Edit-Commit) nicht aufgerufen werden. Wenn Sie über Änderungen von informiert werden möchten, sollten Sie die booleschen Eigenschaften , die von der CheckBox manipuliert werden, direkt beobachten.

So Ihr Handy Implementierung verhält sich ähnlich: rufe nicht edit(...) (was ich denke, ist die Dinge durcheinander) und nicht verlassen sich auf die commitEdit(...), cancelEdit() etc Methoden (die wie du bist nicht funktionieren nicht im Bearbeitungszustand), aber aktualisieren Sie einfach die Modellklasse direkt.

Ich kann nicht testen, da es kein MCVE zu arbeiten gibt, also funktioniert das vielleicht nicht direkt, aber es sollte genug sein, um dich auf etwas vorzubereiten, das funktioniert.

targetEnviroment.setCellFactory(new Callback<TableColumn<DevWorkTabBench, String>, TableCell<DevWorkTabBench, String>>() { 

    @Override 
    public TableCell<DevWorkTabBench, String> call(TableColumn<DevWorkTabBench, String> param) { 
     TableCell<DevWorkTabBench, String> cell = new TableCell<DevWorkTabBench, String>() { 
      @Override 
      public void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 

       if (empty) { 
        setGraphic(null) ; 
       } else { 
        String status = getTableView().getItems().get(getIndex()).getObjectStatus(); 

        if (status.equalsIgnoreCase("ReadyForDeployment")) { 

         ComboBox<String> comboBox = new ComboBox(environmentList); 
         comboBox.valueProperty().addListener(new ChangeListener<String>() { 

          @Override 
          public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
           //commitEdit(newValue); 
           getTableView().getItems().get(getIndex()).setObjectStatus(newValue); 
          } 
         }); 

         comboBox.setValue(item); 
         setGraphic(comboBox); 
        } else { 
         setGraphic(null); 
        } 
       } 
      } 
     }; 

     return cell; 
    } 

}); 
+0

Danke @James_D. Es hat mein Problem behoben. Aber ich kann immer noch nicht verstehen, warum es die Sache verfälscht hat, die Zelle editierbar zu machen. Ich benutze die gleiche Logik auch an anderen Orten (wie in einer 'treetableview'). Auch das gleiche Stück Code arbeitet in einem System, aber an jedem anderen Ort. Dort gibt die gleiche Logik die gewünschte Ausgabe, aber nicht hier. Wie kann es zwei verschiedene Ergebnisse geben? –

+0

Meine Annahme ist, dass der Aufruf von 'edit()' zum Aufruf von 'updateItem()' führt. Dann ersetzen Sie die Grafik durch ein neues Kombinationsfeld (dessen Popup nicht angezeigt wird). I.e. Sobald der Benutzer das Popup anzeigt, ersetzen Sie das Kombinationsfeld. Das ist aber eine Vermutung ... Die Lektion aus der Implementierung von 'CheckBoxTableCell' scheint zu sein, dass für" live "Editierzellen, dh Zellen, in denen die Grafik immer angezeigt wird (was ich mit Kombinationsfeldern besser finde), sollten Sie nicht gehe überhaupt nicht in den Bearbeitungszustand. –

+0

Sie könnten vielleicht mit '' updateItem() 'wie' if (isEditing()) {comboBox.show();} 'mit Logik experimentieren, aber es scheint ein sehr zerbrechlicher Weg zu sein. –

Verwandte Themen