Проблема с использованием FormatStringConverter в ComboBox.setConverter в javafx - PullRequest
1 голос
/ 05 мая 2019

Я должен использовать комбинированный список, чтобы связать список значений (ключ, значение). Ключ - это значение, которое будет сохранено в базе данных, Значение - это описание, которое будет отображаться в выпадающем списке.
например

Key / value  
C1    Code one  
C2    Choice two  
C3    Choice three  
...

Получив, например, выбранное значение «Вариант два», я бы хотел получить код C2. Для хранения элементов в элементах я определил класс ComboVal.

Определяя свой комбобокс, я застрял в определении функции setConverter. Компилятор выдает мне следующую ошибку: "Ошибка: (1093, 49) java: конструктор FormatStringConverter в классе javafx.util.converter.FormatStringConverter не может быть применен к данным типам; обязательно: java.text.Format; найдено: нет аргументы причина: фактические и формальные списки аргументов различаются по длине "

class ComboVal {

        String[] dato = {null, null};

        ComboVal (String Key, String Value)
        {
            setValue(Key, Value);
        }

        ComboVal ()
        {
            setValue(null, null);
        }

        String getValue ()
        {
            return dato[1];
        }

        String getKey ()
        {
            return dato[0];
        }

        void setValue (String Key, String Value)
        {
            dato[0] = Key;
            dato[1] = Value;
        }
}

classe myclass {
....

/*
   Parameter ctrl is a List containing information for dynamyc creation of combobox
*/
void mothod (List ctrl)
{
   VBox box = new VBox();

   box.getChildren().add(new Label(ctrl. label));

   ObservableList items = FXCollections.observableArrayList();

   ComboBox<ComboVal> cb = new ComboBox<>();
   cb.setId(ctrl.name);
   cb.setItems(items);

   //----->>> compiler report error in the next row <<<<<<<<
   cb.setConverter(new FormatStringConverter<ComboVal>() {
     @Override
     public String toString (ComboVal object)
     {
        return (object.getValue());
     }

     @Override
     public ComboVal fromString (String string)
     {
        return null;
     }
   });

   ctrl.options.forEach((k, v) -> {items.add(new ComboVal(k, v));});

   cb.setCellFactory(new Callback<ListView<ComboVal>, ListCell<ComboVal>>() {
      @Override
      public ListCell<ComboVal> call (ListView<ComboVal> p)
      {
         return new ListCell<ComboVal>() {
         @Override
         protected void updateItem (ComboVal item, boolean empty)
         {
            super.updateItem(item, empty);
            if (item == null || empty)
            {
               setGraphic(null);
            }
            else
            {
               setGraphic(new Text(item.getValue()));
            }
         }
      };
    }});

   box.getChildren().add(cb);
}

1 Ответ

0 голосов
/ 07 мая 2019

Класс FormatStringConverter должен быть создан с параметром Format. Однако вы создали его без параметров.

Поставьте Format, например, вот так:

Format format = new MessageFormat("Bla bla");

cb.setConverter(new FormatStringConverter<ComboVal>(format);

FormatStringConverter уже определяет свои собственные методы toString и fromString и будет использовать данный format для анализа и отображения значений. Я сомневаюсь, что это то, что вы хотите, так как это довольно ограничено.

Поэтому я думаю, что вам лучше использовать обычный StringConverter и предоставить пользовательские реализации для toString и fromString.

...