RadioButton // setUserData 和 getUserData 没有按预期工作
RadioButton // setUserData and getUserData don't work as expected
我正在使用 RadioButton
s 并尝试使用 setUserData
方法以便稍后识别它们。在对这个主题进行自我教育之后,我一直在想我可以 setUserData
使用 RadioButton
参考和 getUserData
使用 Toggle
参考,就像在这个Oracle article(示例 4-4)。
现在,这并没有按照我想要的方式进行,导致了很多挫败感。我发现,在使用 group.getSelectedToggle()
后返回的 Toggle
引用上应用 getUserData
时,我无法获得使用 RadioButton
引用设置的相同 userData
.有人知道为什么吗?或者如何优雅地避免这个问题?
我试图在我的 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'
}
}
您忘记为 rBtn1 使用 "fx:id" 而不是 "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'
您正在引用 fxml 文件中的 rBtn1,您可以通过您组中的节点遍历到达该文件,该组具有正确的 fx:id。
当你在做的时候:
t.setUserData("Button " + i);
重做:
System.out.println(group.getToggles().get(0).getUserData()); // prints 'null'
该值已通过组遍历设置,因此 returns 预期值。
rBtn1.setUserData("Button 1");
只是设置本地 class 变量 rBtn1 的 UserData。
我正在使用 RadioButton
s 并尝试使用 setUserData
方法以便稍后识别它们。在对这个主题进行自我教育之后,我一直在想我可以 setUserData
使用 RadioButton
参考和 getUserData
使用 Toggle
参考,就像在这个Oracle article(示例 4-4)。
现在,这并没有按照我想要的方式进行,导致了很多挫败感。我发现,在使用 group.getSelectedToggle()
后返回的 Toggle
引用上应用 getUserData
时,我无法获得使用 RadioButton
引用设置的相同 userData
.有人知道为什么吗?或者如何优雅地避免这个问题?
我试图在我的 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'
}
}
您忘记为 rBtn1 使用 "fx:id" 而不是 "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'
您正在引用 fxml 文件中的 rBtn1,您可以通过您组中的节点遍历到达该文件,该组具有正确的 fx:id。
当你在做的时候:
t.setUserData("Button " + i);
重做:
System.out.println(group.getToggles().get(0).getUserData()); // prints 'null'
该值已通过组遍历设置,因此 returns 预期值。
rBtn1.setUserData("Button 1");
只是设置本地 class 变量 rBtn1 的 UserData。