2017-11-23 19 views
0

RadioButton과 함께 작업 중이며 나중에 식별하기 위해 setUserData 메서드를 사용하려고합니다. 이 주제에 대한 교육을 마친 후, 참조 (예 4-4)와 마찬가지로 나중에 RadioButton 참조와 getUserDataToggle 참조를 사용하여 setUserData을 참조 할 수 있다고 생각했습니다.RadioButton // setUserData 및 getUserData가 예상대로 작동하지 않습니다.

이제는 이것이 내가 원하는 방식으로 작동하지 않아서 많은 좌절감을 불러 일으켰습니다. 나는 같은 것을 얻을 수 없다는 것을 발견했다. userData 을 을 사용한 후에 반환되는 Toggle 참조에 적용 할 때 RadioButton 참조를 사용하여 설정했다. 왜 아무도 알지 못해? 또는이 문제를 어떻게 우아하게 피할 수 있습니까?

SampleController.java 파일에서 내 문제를 명확히하려고 노력했습니다. 아래에서 확인할 수 있습니다. 당신이 보게되는 for loop은 ...

Main.java 내가 생각 해낸 최초의 생각이지만, 확실히 적절한 해결책이 아니다 :

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
     Parent root = FXMLLoader.load(getClass().getResource("/application/sample.fxml")); 
     primaryStage.setTitle("Demo"); 
     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 
     } catch (Exception e) { 
      System.out.println(e.toString() + 
        "\n" + e.getCause()); 
     } 

    } 

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

sample.fxml :

<VBox id="VBox" prefHeight="200" prefWidth="320" 
      xmlns:fx="http://javafx.com/fxml/1" 
      fx:controller="application.SampleController"> 

    <Label text="Select a time, then press the button" /> 

    <fx:define> 
     <ToggleGroup fx:id="group" /> 
    </fx:define> 

    <RadioButton id="rBtn1" text="Button 1" toggleGroup="$group" /> 
    <RadioButton id="rBtn2" text="Button 2" toggleGroup="$group" /> 
    <RadioButton id="rBtn3" text="Button 3" toggleGroup="$group" /> 

</VBox> 

SampleController.java :

public class SampleController implements Initializable { 

    @FXML 
    ToggleGroup group = new ToggleGroup(); 

    RadioButton rBtn1 = new RadioButton(); 
    RadioButton rBtn2 = new RadioButton(); 
    RadioButton rBtn3 = new RadioButton(); 

    @Override 
    public void initialize (URL url, ResourceBundle rb) { 

     rBtn1.setUserData("Button 1"); 
     rBtn2.setUserData("Button 2"); 
     rBtn3.setUserData("Button 3"); 

     System.out.println(rBtn1.getUserData()); // prints 'Button 1' 

     System.out.println(group.getToggles().get(0).getUserData()); // prints 'null' 

     List<Toggle> toggles = group.getToggles(); 
     int i = 1; 
     for (Toggle t : toggles) { 
      t.setUserData("Button " + i); 
      i++; 
     } 

     System.out.println(group.getToggles().get(0).getUserData()); // prints 'Button 1' 

    } 

} 

답변

1

rBtn1에 "id"대신 "fx : id"를 사용하는 것을 잊었습니다. 즉, rBtn1은 fxml 파일의 rBtn1과 동일하지 않습니다.

변경 :

<RadioButton id="rBtn1" text="Button 1" toggleGroup="$group" /> 
<RadioButton id="rBtn2" text="Button 2" toggleGroup="$group" /> 
<RadioButton id="rBtn3" text="Button 3" toggleGroup="$group" /> 

에 :

<RadioButton fx:id="rBtn1" text="Button 1" toggleGroup="$group" /> 
<RadioButton fx:id="rBtn2" text="Button 2" toggleGroup="$group" /> 
<RadioButton fx:id="rBtn3" text="Button 3" toggleGroup="$group" /> 

이 문제가 해결됩니다.

이 일을 :

System.out.println(group.getToggles().get(0).getUserData()); // prints 'null' 

당신은 당신이 올바른 FX을 가지고 그룹에서 노드 탐색에 의해 도달 할 수있는 fxml 파일에서 rBtn1을 참조하는 : ID입니다.

당신이하고 있습니다 :

t.setUserData("Button " + i); 

및 다시 실행은 :

값 따라서 그룹 탐색을 통해 설정되어
System.out.println(group.getToggles().get(0).getUserData()); // prints 'null' 

는 예상 값을 반환합니다.

은 단지 로컬 클래스 변수 rBtn1의 UserData를 설정하고 있습니다.

+0

젠장,이 방법은 간단합니다. 제가 관찰했지만 빠른 수정으로 해결할 수있는 몇 가지 다른 작은 문제는 훨씬 명확합니다. 고마워요! – barbarossa