ListChangeListener, AddListener to ListView или логические флажки в ListView - PullRequest
0 голосов
/ 01 марта 2019

У меня есть Java-программа, которую я не кодировал, которую я переворачивал / обновлял, чтобы добавить некоторые столь необходимые функции.

Эта программа генерирует два ListViews, list1: NameEntry & list2: GroupEntry на основе некоторых файлов CSV, найденных в /input.

NameEntry содержит список имен пользователей с соответствующими флажками.GroupEntry содержит длинный список ролей пользователей со своими флажками.

Моя текущая задача состояла в том, чтобы добавить флажок «Выбрать все роли» в GUI, который устанавливает для всех элементов роли GroupEntry значение «true».Это было успешно выполнено.

Моя проблема заключается в добавлении прослушивателя onChanged () либо в ListView, либо в отдельные элементы флажка, чтобы отключить переключатель «Установить все роли» в случае, если одна или несколько ролейне проверяется вручную.

@FXML
  public void setAllRoles()
  {
    ObservableList<GroupEntry> groups = this.list2.getItems();
    if (this.allRoles) {
      this.allRoles = false;
      for (GroupEntry item : groups) {
      item.setSelected(new SimpleBooleanProperty(false));
      this.list2.refresh();
      }
    } else {
      this.allRoles = true;
      for (GroupEntry item : groups) {
      item.setSelected(new SimpleBooleanProperty(true));
      item.addListener(new ListChangeListener<GroupEntry>() {
           public abstract onChanged(ObservableValue<? extends GroupEntry> ov,
             Boolean old_val, Boolean new_val) {
                 //System.out.println(item.isSelected());
                 allRoles = false;
             }
      });
      }
      this.list2.refresh();
    }
  }

При попытке скомпилировать файл .class контроллера я получаю следующее сообщение об ошибке:

invalid method declaration; return type required
           public abstract onChanged(ObservableValue<? extends GroupEntry> ov,
                           ^

Я также пытался без абстрактного, но компилятор возвращает то же самоеошибка.

Это все javafx.Кто-нибудь имеет представление о том, что может быть проблема или есть какие-либо четкие примеры / руководящие принципы?Я прочитал бесчисленные страницы документации, но, похоже, не могу обойти эту простую ошибку.Я довольно плохо знаком с Java, но не кодирую.

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

После долгих исследований, проб и ошибок приведенный ниже код теперь работает правильно, обеспечивая правильную визуальную обратную связь, используя checkbox.setIndeterminate () и реализуя целочисленные переменные 'current threshhold', 'max threshhold' в паре с 'item.isSelected (). GetValue() 'условия для запуска состояния флажка.Конечно, есть более чистые способы реализации, но это сработало для меня.Исправлено так:

public void setAllRoles()
{
thrshld = 0;
ObservableList<GroupEntry> groups = this.list2.getItems();
for (GroupEntry item : groups) {
  thrshld--;
}
thrshldMax = thrshld;

if (this.allRoles) {
  this.allRoles = false;
  for (GroupEntry item : groups) {
    item.setSelected(new SimpleBooleanProperty(false));
    item.isSelected().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> ov,
          Boolean old_val, Boolean new_val) {
            BooleanProperty thatCB = item.isSelected();
            if (thatCB.getValue() == true) {
              checkbox2.setIndeterminate(true);
              thrshld++; // = thrshld + 1;
            } else {
              thrshld--; // = thrshld - 1;
            } 
            if (thrshld == thrshldMax) {
              checkbox2.setIndeterminate(false);
              checkbox2.setSelected(false);
            }
            if (thrshld == 0) {
              checkbox2.setIndeterminate(false);
              checkbox2.setSelected(true);
            }
            //status.setText("state: " +thatCB.getValue()+ "\r\nthrshld: " +thrshld+ "Max: " +thrshldMax);
          }
    });
  }
  this.list2.refresh();
} else {
  this.allRoles = true;
  thrshld = 0;
  for (GroupEntry item : groups) {
    item.setSelected(new SimpleBooleanProperty(true));
    item.isSelected().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> ov,
          Boolean old_val, Boolean new_val) {
            BooleanProperty thisCB = item.isSelected();
            if (thisCB.getValue() == true) {
              thrshld++; // = thrshld + 1;
              if (thrshld == 0) {
                checkbox2.setIndeterminate(false);
                checkbox2.setSelected(true);
              }
            } else {
              checkbox2.setIndeterminate(true);
              thrshld--; // = thrshld - 1;
              if (thrshld == thrshldMax) {
                checkbox2.setIndeterminate(false);
                checkbox2.setSelected(false);
              }
            }
            //status.setText("state: " +thisCB.getValue()+ "\r\nthrshld: " +thrshld+ "Max: " +thrshldMax);
          }
    });
  }
  this.list2.refresh();
 }
}

Спасибо тем, кто отдал свои 2 цента!Позаботьтесь о переполнении стека!

0 голосов
/ 01 марта 2019

Это простое решение.Вам не хватает типа в объявлении метода.например void.onChanged должен быть методом, а не конструктором.Также удалите квалификаторы abstract.

 public void onChanged(ObservableValue<? extends GroupEntry> ov

EDIT ListChangeListener - это интерфейс.Вам необходимо правильно переопределить метод onChanged.Метод нуждается в тех же параметрах, что и в определении:

void onChanged(ListChangeListener.Change<? extends E> c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...