Изменить отображение 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);
});