Как заставить поле со списком сказать одно, а вставить другое? - PullRequest
0 голосов
/ 19 апреля 2020

Итак, у меня есть настройка поля со списком с каким-то текстом, но я бы хотел, чтобы текст сказал одну вещь, когда я получу значение в тексте, который я хочу вставить в оператор SQL, который я написал

Пример кода

      Label querydroplabel = new Label("Select from drop down");
      ComboBox<String> querydrop = new ComboBox<>();
      querydrop.getItems().addAll(
              "Sort cities by population / acending",
              "Sort cities by population / descending",
              "Sort cities by name",
              "Get total population",
              "Get AVG population",
              "Get Highest population",
              "Get Lowest population");
      querydrop.setOnAction(event ->
      {
          queryTextArea.setText(querydrop.getValue());
      });

Поэтому, когда я выбираю, скажем, первый (Сортировка городов по населению / возрастанию), я хочу получить значение, но хочу, чтобы это значение было SELECT cityname FROM City ORDER BY population ASC

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Полагаю, что относительно простым решением было бы извлечь необходимую SQL String из массива String [] на основе значения индекса выбранного элемента в поле со списком, например:

/* You can fill this array from a section in a text file or
   from a database table of SQL Strings, or whatever...   */
String[] sqlByComboIndex = {"SELECT cityname FROM City ORDER BY population ASC;",  
                            "SELECT cityname FROM City ORDER BY population DESC;",
                            "SELECT cityname FROM City ORDER BY name ASC;",
                            "SELECT SUM(population) FROM City;",
                            "SELECT AVG(population) FROM City;",
                            "SELECT cityname, MAX(population) AS HighestPopulation FROM City GROUP BY cityname ORDERED BY cityname;",
                            "SELECT cityname, MIN(population) AS LowestPopulation FROM City GROUP BY cityname ORDERED BY cityname;"
                            };
int comboIndex = jComboBox1.getSelectedIndex();
String sqlString = null;
if (comboIndex >= 0) {
    sqlString = sqlByComboIndex[comboIndex];
}

Я не даю никаких гарантий по запросам. :)

0 голосов
/ 19 апреля 2020

Проще говоря, вы можете использовать перечисление:

import java.util.Arrays;

public enum ComboSQL {
    SORT_CITY_POPULATION_ASC(
        "Sort cities by population / ascending",
        "SELECT cityname FROM City ORDER BY population ASC"),
    SORT_CITY_POPULATION_DESC(
        "Sort cities by population / descending",
        "SELECT cityname FROM City ORDER BY population DESC"),
    SORT_CITY_NAME        ("Sort cities by name",    "SELECT cityname FROM City ORDER BY cityname"),
    GET_TOTAL_POPULATION  ("Get total population",   "SELECT SUM(population) FROM City"),
    GET_AVERAGE_POPULATION("Get AVG population",     "SELECT AVG(population) FROM City"),
    GET_HIGHEST_POPULATION("Get Highest population", "SELECT MAX(population) FROM City"),
    GET_LOWEST_POPULATION ("Get Lowest population",  "SELECT MIN(population) FROM City");

    private String label;
    private String sql;

    private ComboSQL(String label, String sql) {
        this.label = label;
        this.sql = sql;
    }

    public String getLabel() {
        return this.label;
    }

    public String getSQL() {
        return this.sql;
    }

    public static ComboSQL getByLabel(String label) {
        return Arrays.stream(ComboSQL.values())
                .filter(e -> e.getLabel().equals(label))
                .findFirst().orElse(null);
    }
}

Затем вы сможете заполнить комбо с помощью меток и затем отобразить выбранный элемент комбо на перечисление

      querydrop.getItems().addAll(
          Arrays.stream(ComboSQL.values())
              .map(ComboSQL::getLabel)
              .collect(Collectors.toList())
      );
      // ...
      querydrop.setOnAction(event ->
      {          
          queryTextArea.setText(ComboSQL.getByLabel(querydrop.getValue()).getSQL());
      });

Также можно найти SQL по индексу:

querydrop.setOnAction(event ->
      {          
          int selectedIndex = querydrop.getSelectionModel().getSelectedIndex();
          if (selectedIndex > -1) {
              ComboSQL combo = ComboSQL.values()[selectedIndex];
              queryTextArea.setText(combo.getSQL());
          }
      });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...