2017-10-03 2 views
-1

SceneBuilder에서 9x9 GridPane을 만들고 각 셀에 개별 TextFields을 추가하고 싶습니다. 이와 같은 대형 테이블을 만드는 다른 방법이있을 것이라고 확신하지만, 이것을 수행하는 다른 방법을 찾지는 않습니다 (이것은 내 학습 경험의 일부입니다). FXML/SceneBuilder에 TextFields을 추가하고 싶지 않습니다. 배열에서 이들을 추적하여 개별 값에 액세스 할 수 있으므로 컨트롤러에서 한 번에 하나씩 만들고 배열에 추가하고 GridPane의 각 셀에 추가하려고합니다. 여기 JavaFX에서 FXML과 컨트롤러를 모두 사용하여 장면 만들기

는 (배열에 추가하기 전에 내가 그들을 만드는 시도) TextFields 추가하려고 내 컨트롤러의 일부입니다

@FXML 
private GridPane gridPane; 
private TextField myTextField[][] = new TextField[9][9]; 
. 
. 
. 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    for (int i = 0; i < 9; ++i){ 
     for (int j = 0; j < 9; ++j){ 

      TextField tempTextField = new TextField(); 
      Font myFont = new Font("System",38); 
      tempTextField.setFont(myFont); 
      tempTextField.setText(i + ", " + j); 
      tempTextField.setPrefSize(70, 70); 
      myTextField[i][j] = tempTextField; 
      gridPane.add(tempTextField,i,j); 
      System.out.println("TextField " +i+j+" Created!"); 
     } 
    } 
} 

내가 실행하기 전에 오류가 발생하지 않는 장면이 아니다 업데이트되었습니다.

편집 : 나는 StackTrace 쳐다 보면서 내가

gridPane.add(tempTextField,i,j); 

FXML 파일에서 널 포인터를 얻고 것으로 나타났습니다 :

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.text.*?> 
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="654.0" prefWidth="747.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="sudokusolver.FXMLDocumentController"> 
    <children> 
     <BorderPane prefHeight="654.0" prefWidth="747.0"> 
     <center> 
      <GridPane fx:id="gridPane" gridLinesVisible="true" prefHeight="198.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       </columnConstraints> 
       <rowConstraints> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       </rowConstraints> 
      </GridPane> 
     </center> 
     <bottom> 
      <HBox alignment="CENTER" prefHeight="40.0" prefWidth="747.0" BorderPane.alignment="CENTER"> 
       <children> 
        <FlowPane prefHeight="200.0" prefWidth="200.0"> 
        <children> 
         <Button fx:id="loadButton" alignment="CENTER" contentDisplay="CENTER" minHeight="-Infinity" minWidth="-Infinity" onAction="#setGrid" prefHeight="35.0" prefWidth="100.0" text="Load Board" /> 
          <Button fx:id="solveButton" alignment="CENTER" contentDisplay="CENTER" minHeight="-Infinity" minWidth="-Infinity" onAction="#sudokuSolve" prefHeight="35.0" prefWidth="100.0" text="Solve" /> 
        </children> 
        </FlowPane> 
       </children> 
      </HBox> 
     </bottom> 
     </BorderPane> 
    </children> 
</AnchorPane> 
+0

분명히 'gridPane'은 null입니다. 어쩌면 FXML 파일을 게시할까요? –

+0

@James_D 업데이트했습니다. 또한 질문을 업데이트하면 댓글을 달았던 사람들에게 알릴 수 있습니까? 그렇게하면 무의미한 태그/주석을 피할 수 있습니다. – Raitab

+0

아니요, 질문 수정에 대한 자동 알림이 없습니다 (다른 사람이 질문이나 답변을 수정 한 경우 알림 제외). –

답변

2

javafx.fxml.Initializable 인터페이스를 구현하는 시도 귀하의 컨트롤러와 setGrid() 로직과 함께 제공되는 방법으로 이동하십시오.

+5

JavaFX 2.1부터'Initializable'을 구현할 필요가 없습니다. 그냥'public void initialize()'메소드를 정의하면 리플렉션에 의해 자동으로 호출됩니다. –

+0

초기화는 이전에 시도한 작업입니다. 나는 그것을 다시 시도해 보았지만 효과가 없다. 나는 컴파일 할 때 주어진 오류를 게시 할 수는 있지만 매우 길다. Reflection, Loader 및 Null Pointer 예외가 있지만 내 코드를 직접 가리 키지는 않습니다. – Raitab

+0

@Raitab 질문을 편집하여'initialize()'및 완전한 스택 추적을 사용하십시오. 널 포인터 예외가있는 경우 https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it을 읽고 수정하려고했습니다. –

관련 문제