2013-04-09 30 views
6

Tôi đã theo dõi Ví dụ 13-11 Giải pháp thay thế chỉnh sửa ô từ số offical tableview tutorial, nhưng tôi muốn số tableview hoạt động như jtable. Điều này có nghĩa là khi một ô được lấy nét, nó đã sẵn sàng để chỉnh sửa và sử dụng các phím mũi tên hoặc phím Enter sẽ ngay lập tức cam kết chỉnh sửa và di chuyển đến ô kế tiếp.Có ai đã tìm ra cách để thực hiện một hành động tableview javafx như một jtable?

Đây là những gì tôi đã đi quá xa:

Đầu tiên, tôi đã thêm

table.getSelectionModel().setCellSelectionEnabled(true); 

Sau đó, tôi đã cố gắng để sửa đổi các lớp EditingCell:

class EditingCell extends TableCell<Person, String> { 

    private TextField textField; 

    public EditingCell() { 
    } 

    @Override 
    public void updateSelected(boolean selected) { 
     super.updateSelected(selected); 
     if (selected) { 
      createTextField(); 
      setText(null); 
      setGraphic(textField); 
      textField.requestFocus(); 
      textField.selectAll(); 
     } else { 
      String value = textField.getText(); 
      if (value != null) { 
       commitEdit(value); 
      } else { 
       commitEdit(null); 
      } 
     } 
    } 


    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 

     setText((String) getItem()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       if (textField != null) { 
        textField.setText(getString()); 
       } 
       setText(null); 
       setGraphic(textField); 
      } else { 
       setText(getString()); 
       setGraphic(null); 
      } 
     } 
    } 

    private void createTextField() { 
     textField = new TextField(getString()); 
     textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2); 
     textField.focusedProperty().addListener(new ChangeListener<Boolean>() { 
      @Override 
      public void changed(ObservableValue<? extends Boolean> arg0, 
        Boolean arg1, Boolean arg2) { 
       if (!arg2) { 
        commitEdit(textField.getText()); 
       } 
      } 
     }); 
     textField.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent t) { 
       if ((t.getCode() == KeyCode.ENTER) || (t.getCode() == KeyCode.UP) || (t.getCode() == KeyCode.DOWN) || (t.getCode() == KeyCode.LEFT) || (t.getCode() == KeyCode.RIGHT)) { 
        t.consume(); 
        String value = textField.getText(); 
        if (value != null) { 
         commitEdit(value); 
        } else { 
         commitEdit(null); 
        } 
       } else if (t.getCode() == KeyCode.ESCAPE) { 
        cancelEdit(); 
       } 
      } 
     }); 
    } 

    private String getString() { 
     return getItem() == null ? "" : getItem().toString(); 
    } 
} 

Các tableview tôi nhận được một mớ hỗn độn - Tôi phải bấm phím Enter hai lần để kết thúc chỉnh sửa, và nó sẽ không cam kết chỉnh sửa nhưng thay vào đó hủy bỏ nó.

Có ai có thể chỉ cho tôi đúng hướng không?

+0

Tôi cảm thấy đau đớn của bạn ... Tôi đã không làm việc trên các bảng javafx trong một vài năm, nhưng đây là một mẩu bánh mì có thể là những gì bạn đang cố gắng làm: http://stackoverflow.com/questions/7880494/tableview-better-editing-through-binding/7884249 # 7884249 – jkaufmann

Trả lời

1

Thật đáng buồn là hướng dẫn thiếu một số bản sửa lỗi mã được giới thiệu sau trong lớp TextFieldTableCell để ENTER hoạt động đúng (RT-34685 - Use onAction instead of onKeyPressedRT-28132 - Call requestFocus()).

Dưới đây là một ví dụ làm việc, đó là một phiên bản thu gọn của mã TextFieldTableCell mà còn sử dụng Node.fireEvent() để di chuyển tới ô tiếp theo sau khi cam kết (bắt chước một sự kiện keyPressed):

class EditingCell extends TableCell<Person, String> 
{ 
    private TextField textField; 

    public EditingCell() 
    { 
    } 

    @Override 
    public void startEdit() 
    { 
     if (!isEditable() || !getTableView().isEditable() 
       || !getTableColumn().isEditable()) 
     { 
      return; 
     } 
     super.startEdit(); 

     if (isEditing()) 
     { 
      if (textField == null) 
      { 
       createTextField(); 
      } 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
      // requesting focus so that key input can immediately go into 
      // the TextField (see RT-28132) 
      textField.requestFocus(); 
     } 
    } 

    @Override 
    public void cancelEdit() 
    { 
     super.cancelEdit(); 

     setText((String) getItem()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(String item, boolean empty) 
    { 
     super.updateItem(item, empty); 

     if (empty) 
     { 
      setText(null); 
      setGraphic(null); 
     } else 
     { 
      if (isEditing()) 
      { 
       if (textField != null) 
       { 
        textField.setText(getString()); 
       } 
       setText(null); 
       setGraphic(textField); 
      } else 
      { 
       setText(getString()); 
       setGraphic(null); 
      } 
     } 
    } 

    private void createTextField() 
    { 
     textField = new TextField(getString()); 
     textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2); 
     textField.focusedProperty().addListener(new ChangeListener<Boolean>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Boolean> arg0, 
        Boolean arg1, Boolean arg2) 
      { 
       if (!arg2) 
       { 
        commitEdit(textField.getText()); 
       } 
      } 
     }); 

     // Use onAction here rather than onKeyReleased (with check for 
     // Enter), as otherwise we encounter RT-34685 
     textField.setOnAction(t -> { 
      commitEdit(textField.getText()); 
      t.consume(); 
     }); 
     textField.setOnKeyReleased(t -> { 
      if (t.getCode() == KeyCode.ESCAPE) 
      { 
       cancelEdit(); 
       t.consume(); 
      } 
     }); 

     textField.setOnKeyPressed(new EventHandler<KeyEvent>() 
     { 
      @Override 
      public void handle(KeyEvent t) 
      { 
       if ((t.getCode() == KeyCode.UP) || (t.getCode() == KeyCode.DOWN) 
         || (t.getCode() == KeyCode.LEFT) 
         || (t.getCode() == KeyCode.RIGHT)) 
       { 
        // Commit the current text 
        commitEdit(textField.getText()); 

        // Let's move out simulating a key press in this Cell 
        KeyEvent event = new KeyEvent(t.getSource(), t.getTarget(), 
          KeyEvent.KEY_PRESSED, "", "", t.getCode(), false, false, 
          false, false); 
        EditingCell.this.fireEvent(event); 
       } 
      } 
     }); 
    } 

    private String getString() 
    { 
     return getItem() == null ? "" : getItem().toString(); 
    } 
} 

Hope this helps!

Các vấn đề liên quan