2015-04-18 2 views
1

ПроблемаКак осуществить правильный двойной щелчок-для-редактирования в TableView

TableView, кажется, переходит в режим редактирования, как только вы нажмете на уже выбранной ячейке. Это нежелательное и непоследовательное поведение, потому что выбор изменяется, если вы выходите за пределы текущего выделения. Он не изменяется, когда вы нажимаете внутри текущего выделения.

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

Размножение:

Создать TableView с этим режимом выбора:

// cell selection mode instead of row selection 
table.getSelectionModel().setCellSelectionEnabled(true); 

// allow selection of multiple cells 
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

Теперь выберите несколько ячеек (через сдвиговый нажатия клавиши). Затем нажмите на одну ячейку выделенных ячеек.

Текущее поведение:

  • таблица переходит в режим редактирования

Вопрос

Запрашиваемый поведение:

  • только выбор должен измениться, я , е. следует выбрать одну ячейку; режим редактирования должен выполняться только при двойном щелчке

Как вы можете достичь этого?

Код

Вот полный пример. Я взял код с веб-сайта образцов Oracle, добавил вышеперечисленные строки и предварительно отобранных всех ячеек. При нажатии на одну ячейку после запуска программы, таблица переходит непосредственно в режим редактирования:

public class TableViewSample extends Application { 

    private TableView<Person> table = new TableView<Person>(); 
    private final ObservableList<Person> data = 
      FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "[email protected]"), 
      new Person("Isabella", "Johnson", "[email protected]"), 
      new Person("Ethan", "Williams", "[email protected]"), 
      new Person("Emma", "Jones", "[email protected]"), 
      new Person("Michael", "Brown", "[email protected]")); 
    final HBox hb = new HBox(); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(450); 
     stage.setHeight(550); 

     final Label label = new Label("Address Book"); 
     label.setFont(new Font("Arial", 20)); 

     table.setEditable(true); 

     TableColumn firstNameCol = new TableColumn("First Name"); 
     firstNameCol.setMinWidth(100); 
     firstNameCol.setCellValueFactory(
      new PropertyValueFactory<Person, String>("firstName")); 
     firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn()); 
     firstNameCol.setOnEditCommit(
      new EventHandler<CellEditEvent<Person, String>>() { 
       @Override 
       public void handle(CellEditEvent<Person, String> t) { 
        ((Person) t.getTableView().getItems().get(
          t.getTablePosition().getRow()) 
          ).setFirstName(t.getNewValue()); 
       } 
      } 
     ); 


     TableColumn lastNameCol = new TableColumn("Last Name"); 
     lastNameCol.setMinWidth(100); 
     lastNameCol.setCellValueFactory(
      new PropertyValueFactory<Person, String>("lastName")); 
     lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn()); 
     lastNameCol.setOnEditCommit(
      new EventHandler<CellEditEvent<Person, String>>() { 
       @Override 
       public void handle(CellEditEvent<Person, String> t) { 
        ((Person) t.getTableView().getItems().get(
         t.getTablePosition().getRow()) 
         ).setLastName(t.getNewValue()); 
       } 
      } 
     ); 

     TableColumn emailCol = new TableColumn("Email"); 
     emailCol.setMinWidth(200); 
     emailCol.setCellValueFactory(
      new PropertyValueFactory<Person, String>("email")); 
     emailCol.setCellFactory(TextFieldTableCell.forTableColumn()); 
     emailCol.setOnEditCommit(
      new EventHandler<CellEditEvent<Person, String>>() { 
       @Override 
       public void handle(CellEditEvent<Person, String> t) { 
        ((Person) t.getTableView().getItems().get(
         t.getTablePosition().getRow()) 
         ).setEmail(t.getNewValue()); 
       } 
      } 
     ); 

     table.setItems(data); 
     table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); 

     final TextField addFirstName = new TextField(); 
     addFirstName.setPromptText("First Name"); 
     addFirstName.setMaxWidth(firstNameCol.getPrefWidth()); 
     final TextField addLastName = new TextField(); 
     addLastName.setMaxWidth(lastNameCol.getPrefWidth()); 
     addLastName.setPromptText("Last Name"); 
     final TextField addEmail = new TextField(); 
     addEmail.setMaxWidth(emailCol.getPrefWidth()); 
     addEmail.setPromptText("Email"); 

     final Button addButton = new Button("Add"); 
     addButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent e) { 
       data.add(new Person(
         addFirstName.getText(), 
         addLastName.getText(), 
         addEmail.getText())); 
       addFirstName.clear(); 
       addLastName.clear(); 
       addEmail.clear(); 
      } 
     }); 

     hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton); 
     hb.setSpacing(3); 

     final VBox vbox = new VBox(); 
     vbox.setSpacing(5); 
     vbox.setPadding(new Insets(10, 0, 0, 10)); 
     vbox.getChildren().addAll(label, table, hb); 

     ((Group) scene.getRoot()).getChildren().addAll(vbox); 

     stage.setScene(scene); 
     stage.show(); 

     // cell selection mode instead of row selection 
     table.getSelectionModel().setCellSelectionEnabled(true); 

     // allow selection of multiple cells 
     table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

     // select all for demo purposes 
     table.getSelectionModel().selectAll(); 
    } 

    public static class Person { 

     private final SimpleStringProperty firstName; 
     private final SimpleStringProperty lastName; 
     private final SimpleStringProperty email; 

     private Person(String fName, String lName, String email) { 
      this.firstName = new SimpleStringProperty(fName); 
      this.lastName = new SimpleStringProperty(lName); 
      this.email = new SimpleStringProperty(email); 
     } 

     public String getFirstName() { 
      return firstName.get(); 
     } 

     public void setFirstName(String fName) { 
      firstName.set(fName); 
     } 

     public String getLastName() { 
      return lastName.get(); 
     } 

     public void setLastName(String fName) { 
      lastName.set(fName); 
     } 

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

     public void setEmail(String fName) { 
      email.set(fName); 
     } 
    } 
} 

ответ

0

Вы можете попытаться очистить выбор на мыши нажатой события:

table.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() 
     { 
      @Override 
      public void handle(MouseEvent event) 
      { 
       if(event.isControlDown()) { 
        return; 
       } 

       if (table.getEditingCell() == null) { 
        table.getSelectionModel().clearSelection(); 
       } 
      } 
     }); 
+0

Спасибо, что работали. Я изменил код для управления ключом управления. По какой-то причине выбор больше не работал, когда вы нажали клавишу управления. – Roland

+0

@Roland, на Java8u40, нет проблем с нажатием клавиши управления для кода в вопросе. –

+0

Я нахожусь на Java8u40, Win7. Вы пытались выбрать несколько ячеек с нажатой клавишей управления? Для меня он всегда выбирал только 1 ячейку вместо добавления к выбору. – Roland

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