2016-08-27 9 views
0

для проекта, над которым я работаю, я должен отображать значения матрицы на экране. Я решил сделать это с помощью текстовых полей в gridpane, как следующий код указывает:Javafx получить текст из текстовых полей в gridpane

for(int row = 0; row < length; row++){ 
     for(int column = 0; column < width; column++){ 
      // Create a new TextField in each Iteration 
      TextField tf = new TextField(); 
      tf.setPrefHeight(50); 
      tf.setPrefWidth(50); 
      tf.setAlignment(Pos.CENTER); 
      tf.setEditable(true); 
      tf.setText(String.valueOf(this.getElement(row, column))); 

      // Iterate the Index using the loops 
      setRowIndex(tf,row); 
      setColumnIndex(tf,column);  
      table.getChildren().add(tf); 
     } 
    } 

Если изменить значения в этом окне для текстовых полей, я хочу, чтобы иметь возможность сохранить их. Чтобы сделать это, я должен уметь получать текст из текстовых полей. Я пробовал использовать следующий код, но итерация по элементам таблицы определяется как Nodes и поэтому не имеет метода .getText().

OkButton.setOnAction(new EventHandler<ActionEvent>(){ 
     @Override 
     public void handle (ActionEvent event){ 
      for (Node nd:table.getChildren()){ 
       //Code goes here but Node does not have .getText() method 
      } 

      Stage stage = (Stage) OkButton.getScene().getWindow(); 
      stage.close(); 
     } 
    }); 

Кто-нибудь знает, как получить эти значения?

Большое спасибо!

ответ

2

Предполагая, что table имеет типа GridPane, вы должны добавить свои TextField сек, как это:

table.add(tf, column, row); 

Для доступа к элементу, когда он Col и гребные индексы известны нет простого способа:

public Node getNodeByRowColumnIndex(final int row,final int column,GridPane gridPane) { 
    Node result = null; 
    ObservableList<Node> childrens = gridPane.getChildren(); 
    for(Node node : childrens) { 
     if(gridPane.getRowIndex(node) == row && gridPane.getColumnIndex(node) == column) { 
      result = node; 
      break; 
     } 
    } 
    return result; 
} 

См. Также ответ на вопрос JavaFX: Get Node by row and column.

+0

Спасибо за ваш ответ hotzst. Разве это не так, что все же результатом является объект Node, не имеющий метода .getText(). Так что я до сих пор не знаю, что такое текст в текстовом поле? Или я что-то пропускаю? – ComputerSaysNo

+0

Нет, вы правы, что вы получаете от итерации через детей - это «Узел». Однако, если в вашем коде вы добавляете 'TextField', вы можете добавить приведение в' TextField' в getNodeByRowColumnIndex' и вернуть 'TextField'. В противном случае, если вас интересуют только ячейки, в которых хранится 'TextField', вы можете адаптировать метод для дополнительной проверки типа узла в инструкции if, и если совпадение не найдено, возвращайте' null' или 'Optional' из null, который я бы предпочел. – hotzst

+0

Я немного новичок в Java, поэтому я не знал о кастинге. Действительно, моя таблица содержит только TextFields, поэтому я могу ее использовать. Большое спасибо за помощь! – ComputerSaysNo