Java 使用RadioButton更改文本字段显示

Java 使用RadioButton更改文本字段显示,java,javafx,dynamic,gridpane,Java,Javafx,Dynamic,Gridpane,我在网格窗格中放置标签和文本字段以响应切换的单选按钮时遇到问题 该窗口将显示相同的选项,但两个不同的标签和文本字段除外,这取决于用户选择的RadioButton(参见所附图像) 我将RadioButton对象添加到一个切换组,然后对“on actions”进行编码,以便在选择其中一个选项时根据需要将“Machine ID”或“Company Name”字段添加到GridPane 我的问题是,每个选项只能选择一次,第二个选项的显示仅与第一个实例重叠,而不是替换它。如果我再次尝试切换回来,我会得

我在网格窗格中放置标签和文本字段以响应切换的单选按钮时遇到问题

该窗口将显示相同的选项,但两个不同的标签和文本字段除外,这取决于用户选择的RadioButton(参见所附图像)

我将RadioButton对象添加到一个切换组,然后对“on actions”进行编码,以便在选择其中一个选项时根据需要将“Machine ID”或“Company Name”字段添加到GridPane

我的问题是,每个选项只能选择一次,第二个选项的显示仅与第一个实例重叠,而不是替换它。如果我再次尝试切换回来,我会得到一个运行时错误(在Netbeans中),关于将同一对象添加到网格两次

我尝试过的任何可以从显示中删除节点的代码都不会影响菜单的行为

    ArrayList<Label> typeSpecLabels = new ArrayList<Label>();
    ArrayList<TextField>typeSpecFields = new ArrayList<TextField>();

    typeSpecLabels.add(machineIDLabel);
    typeSpecLabels.add(companyLabel);

    typeSpecFields.add(machineIDField);
    typeSpecFields.add(companyNameField);

    inHouseBtn.setOnAction(inHouseSpecificEvent ->
    { 
        typeSpecLabels.add(machineIDLabel);

        grid1.add(typeSpecLabels.get(0),0,8,1,1);
        grid1.add(typeSpecFields.get(0), 1,8,1,1);


        if(outSourceBtn.isArmed() == true){
            grid1.getChildren().remove(companyLabel);
            grid1.getChildren().remove(companyNameField);
        }
    });


    outSourceBtn.setOnAction(outSourceSpecificEvent ->
    {
        typeSpecLabels.add(companyLabel);
        grid1.add(companyLabel,0,8,1,1);
        grid1.add(companyNameField,1,8,1,1);

        if(outSourceBtn.isArmed() == true){
            grid1.getChildren().remove(machineIDLabel);
            grid1.getChildren().remove(machineIDField);
        }
    });
ArrayList typeSpecLabels=new ArrayList();
ArrayListtypeSpecFields=新的ArrayList();
typeSpecLabels.add(machineIDLabel);
typeSpecLabels.add(公司标签);
typeSpecFields.add(machineIDField);
typeSpecFields.add(companyNameField);
inHouseBtn.setOnAction(inHouseSpecificEvent->
{ 
typeSpecLabels.add(machineIDLabel);
grid1.add(typeSpecLabels.get(0),0,8,1,1);
grid1.add(typeSpecFields.get(0),1,8,1,1);
if(outSourceBtn.isArmed()==true){
grid1.getChildren().remove(companyLabel);
grid1.getChildren().remove(companyNameField);
}
});
外包业务BTN.setOnAction(外包业务规格事件->
{
typeSpecLabels.add(公司标签);
grid1.add(companyLabel,0,8,1,1);
grid1.add(companyNameField,1,8,1,1);
if(outSourceBtn.isArmed()==true){
grid1.getChildren().remove(machineIDLabel);
grid1.getChildren().remove(machineIDField);
}
});

我听说我可以尝试使用2到3个不同的场景(每个单选按钮的状态对应一个场景),所以我可以试试。但是,如果可以按照我到目前为止的编码方式完成,我更愿意这样做。

我建议从网格中删除所有特定于类型的标签和字段,然后添加所需的标签和字段。因此,代码如下所示:

inHouseBtn.setOnAction(inHouseSpecificEvent ->
{ 
    grid1.getChildren().removeAll(machineIDLabel, companyLabel, machineIDField, companyNameField);

    grid1.add(machineIDLabel,0,8,1,1);
    grid1.add(machineIDField, 1,8,1,1);
});


outSourceBtn.setOnAction(outSourceSpecificEvent ->
{
    grid1.getChildren().removeAll(machineIDLabel, companyLabel, machineIDField, companyNameField);

    grid1.add(companyLabel,0,8,1,1);
    grid1.add(companyNameField,1,8,1,1);
});

正如帕夫洛所说,这段代码最终起了作用。 虽然我只是移除了特定于相反事件的对象。 代码工作时没有错误或重叠

        inHouseBtn.setOnAction(inHouseSpecificEvent ->
    {

        grid1.add(machineIDLabel,0,8,1,1);
        grid1.add(machineIDField,1,8,1,1);

        grid1.getChildren().remove(companyLabel);
        grid1.getChildren().remove(companyNameField);
    });


    outSourceBtn.setOnAction(outSourceSpecificEvent ->
    {

        grid1.add(companyLabel,0,8,1,1);
        grid1.add(companyNameField,1,8,1,1);

        grid1.getChildren().remove(machineIDLabel);
        grid1.getChildren().remove(machineIDField);
    });

为什么要在场景中添加和删除?难道你不能使其可见/不可见吗?这将解决重叠问题,但如果我重新选择之前已选择的按钮,gui仍会没有响应。基于运行时错误,我认为我需要从网格中删除节点。当我将项目添加到ArrayList时,我考虑了这些问题,因为它们可以根据需要添加/删除元素。我会按照你建议的方式试一下,看看能得到什么。