Изменить отображение TextField с помощью RadioButton

У меня проблема с размещением Label и TextField на сетке в ответ на переключенные кнопки RadioButton.

В окне будут отображаться те же параметры, за исключением двух разных надписей и текстовых полей, которые зависят от того, какую кнопку RadioButton выбрал пользователь (см. Изображения в приложении).

InHouse RB Selected Аутсорсинг RB выбран

Я добавил объекты RadioButton в Toggle Group, а затем закодировал "включенные действия", чтобы добавить поля "Идентификатор машины" или "Название компании" в 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);
        }
    });

Я слышал, что могу попробовать использовать 2 или 3 разные сцены (по одной для каждого состояния RadioButton), поэтому я могу попробовать это. Но если это можно сделать так, как я до сих пор кодировал, я бы предпочел сделать это так.

2 ответа

Решение

Этот код закончил работать, как предположил Павло. Хотя я просто удалил объекты, характерные для противоположного события. Код работает без ошибок или совпадений.

        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);
    });

Я бы посоветовал удалить все типы меток и полей из вашей сетки, а затем добавить те, которые вам нужны. Таким образом, код будет выглядеть следующим образом:

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);
});
Другие вопросы по тегам