2016-03-22 5 views
-2

таблица fxml. Столбцы: имя, фамилия, телефон, электронная почта Я бы хотел, чтобы мы щелкнули мышкой по столбцу электронной почты, чтобы редактировать точный адрес электронной почты. Следующий код работает не правильно, всегда открытое письмо, редактировать, а не точная ячейкаКак отредактировать/открыть точную ячейку в таблице

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

Где остальная часть кода? это полно? –

+0

YEs это полный. У меня есть имя электронной почты fxml, и я хочу использовать только этот столбец, и я не могу найти в intertet, как я могу это сделать. –

ответ

0

Вот простой пример того, как изменить столбец в виде таблицы. Вы можете использовать столбец текстового поля, который позволит вводить данные при нажатии на него. В этом случае доступен только столбец электронной почты.

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>() { 

устанавливает обработчик щелчка для всей TableView вместо этого. Таким образом, вы не можете различать столбцы, которые были нажаты.

Вы должны использовать функцию редактирования, предоставленную TableCell вместо:

// 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

Это код, который не использует сценарий fxml, когда я использую код SceneBuilder другой, тогда я использую JPanel –

+0

@AlexAs: Интересно, line 'table.setOnMouseClicked (новый EventHandler () {' был помещен тогда ... Также легко собрать части в fxml, если вы используете класс верхнего уровня как 'cellFactory' . Также в прошлый раз, когда я проверил, SceneBuilder не разрешил вам выбирать 'cellValueFactory' /' cellFactory', поэтому, если вы полагаетесь только на fxmls, которые создаются SceneBuilder, вы все равно не сможете выполнить задачу. , – fabian

Смежные вопросы