2016-03-22 15 views
-2

Die Tabelle ist fxml. Spalten: Vorname, Nachname, Telefon, E-Mail Ich möchte per Mausklick in der Spalte Email per Mausklick die E-Mail bearbeiten. Der folgende Code funktioniert nicht richtig, immer offen E-Mail zu bearbeiten, nicht genau ZelleSo bearbeiten/öffnen Sie eine exakte Zelle in der Tabelle

table.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>() { 
+0

Wo der Rest des Codes ist? ist das abgeschlossen? –

+0

YEs das abgeschlossen. Ich habe fxml Name Email und ich möchte nur diese Spalte verwenden, und ich finde nicht in intertet, wie ich es tun kann –

Antwort

0

Hier ist ein einfaches Beispiel dafür, wie eine Spalte in einer Tabellenansicht zu bearbeiten. Sie können eine Textfeldspalte verwenden, die die Eingabe von Daten ermöglicht, wenn Sie darauf klicken. In diesem Fall ist nur die E-Mail-Spalte bearbeitbar.

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 


public class JavaFXApplication7 extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TableView<Person> tv = new TableView(); 
     TableColumn<Person, String> fCol = new TableColumn<>(); 
     TableColumn<Person, String> lCol = new TableColumn<>(); 
     TableColumn<Person, String> pCol = new TableColumn<>(); 
     TableColumn<Person, String> eCol = new TableColumn<>(); 

     tv.setEditable(true); 
     tv.getColumns().addAll(fCol, lCol, pCol, eCol); 

     fCol.setCellValueFactory(data -> data.getValue().firstName); 
     lCol.setCellValueFactory(data -> data.getValue().lastName); 
     pCol.setCellValueFactory(data -> data.getValue().phone); 
     eCol.setCellValueFactory(data -> data.getValue().email); 
     eCol.setCellFactory(tc -> new TextFieldTableCell<>()); 

     ObservableList<Person> items = FXCollections.observableArrayList(); 
     Person p = new Person(); 
     p.email.set("[email protected]"); 
     p.firstName.set("Tony"); 
     p.lastName.set("Stark"); 
     p.phone.set("(555) 555-1212"); 

     items.add(p); 

     tv.setItems(items); 

     StackPane root = new StackPane(); 
     root.getChildren().add(tv); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public class Person { 
     StringProperty firstName = new SimpleStringProperty(); 
     StringProperty lastName = new SimpleStringProperty(); 
     StringProperty phone = new SimpleStringProperty(); 
     StringProperty email = new SimpleStringProperty(); 



    } 

} 
0
table.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>() { 

setzt den Click-Handler für die ganze TableView statt. Auf diese Weise können Sie nicht zwischen den Spalten unterscheiden, auf die geklickt wurde.

sollten Sie verwenden die Bearbeitungsfunktion von TableCell stattdessen zur Verfügung gestellt:

// Simplified Person class 
public class Person { 

    private final StringProperty name; 

    private final StringProperty email; 

    public Person(String name, String email) { 
     this.email = new SimpleStringProperty(email); 
     this.name = new SimpleStringProperty(name); 
    } 

    public final String getEmail() { 
     return this.email.get(); 
    } 

    public final void setEmail(String value) { 
     this.email.set(value); 
    } 

    public final StringProperty emailProperty() { 
     return this.email; 
    } 

    public final String getName() { 
     return this.name.get(); 
    } 

    public final void setName(String value) { 
     this.name.set(value); 
    } 

    public final StringProperty nameProperty() { 
     return this.name; 
    } 

} 
TableView<Person> table = new TableView<>(FXCollections.observableArrayList(
     new Person("Darth Vader", "[email protected]"), 
     new Person("James Bond", "[email protected]"))); 
table.setEditable(true); 

Callback<TableColumn<Person, String>, TableCell<Person, String>> cellFactory = col 
     -> new TableCell<Person, String>() { 

      { 
       // make cell itself editable 
       setEditable(true); 
      } 

      @Override 
      public void startEdit() { 
       super.startEdit(); 
       // open dialog for input when the user edits the cell 
       TextInputDialog dialog = new TextInputDialog(getItem()); 
       dialog.setGraphic(null); 
       dialog.setHeaderText("Set new " + col.getText() + "."); 
       dialog.setTitle("Edit " + col.getText()); 
       Optional<String> opt = dialog.showAndWait(); 
       if (opt.isPresent()) { 
        commitEdit(opt.get()); 
       } else { 
        cancelEdit(); 
       } 
      } 

      @Override 
      protected void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 
       setText(empty ? null : item); 
      } 

     }; 

TableColumn<Person, String> name = new TableColumn<>("name"); 
name.setCellValueFactory(p -> p.getValue().nameProperty()); 
name.setCellFactory(cellFactory); 

TableColumn<Person, String> email = new TableColumn<>("email"); 
email.setCellValueFactory(p -> p.getValue().emailProperty()); 
email.setCellFactory(cellFactory); 

table.getColumns().addAll(name, email); 
+0

Es ist Code nicht verwenden fxml Szene, wenn ich SceneBuilder Code ein anderes dann verwende ich JPanel –

+0

@AlexAs: Ich frage mich, wo line 'table.setOnMouseClicked (new EventHandler () {' wurde dann eingefügt ... Auch ist es einfach, die Teile in der fxml zusammenzusetzen, wenn Sie eine Top-Level-Klasse als 'cellFactory' verwenden Auch wenn ich das letzte Mal nachgesehen habe, hat SceneBuilder Ihnen nicht erlaubt, 'cellValueFactory' /' cellFactory' zu wählen. Wenn Sie sich also nur auf fxmls verlassen, die von SceneBuilder erzeugt werden, können Sie die Aufgabe sowieso nicht ausführen. . – fabian

Verwandte Themen