Как я могу достичь объекта в выпадающем списке jSwing? - PullRequest
0 голосов
/ 15 мая 2018

Я работаю над настольным Java-приложением на основе maven и использую фреймы jSwing для интерфейса. Мне нужно показать людям Задачи с их именами в выпадающем списке, но я не уверен, что я сделал это хорошо.

В этом разделе кода я получил Задачи из своей базы данных в виде списков, затем я показал их в выпадающем списке.

List<TmsTask> task;
    int i;
    try {
        task = Application.getApp().getMainService().getTasksList();
        for (i = 0; i <= task.size(); i++) {
            jComboBoxTask.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{task.get(i).getTaskName(), 
                                                                                       task.get(i + 1).getTaskName(),
                                                                                       task.get(i + 2).getTaskName()}));
        }

    } catch (Exception ex) {
        Logger.getLogger(BindTask.class.getName()).log(Level.SEVERE, null, ex);
    }

Это хорошо, я вижу Задание имена в выпадающем списке.

Проблема в том, Я хочу сохранить другую информацию в базу данных, используя эту задачу. Но, как видите, выбранные вещи (в выпадающем списке) просто имена задач, а не объекты задач.

Как разместить объекты задач в разделах опций в выпадающем списке?

В этом разделе кода я пытался извлечь объекты Task из базы данных и показать их в секциях combobox, но во всех секциях combobox отображается одно и то же имя задачи.

private void jComboBoxTaskMousePressed(java.awt.event.MouseEvent evt) {                                           
    TmsTask task;

    try {
        task = Application.getApp().getMainService().getTasks();

            jComboBoxTask.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{task.getTaskName(), 
                                                                                       task.getTaskName(),
                                                                                       task.getTaskName()}));


    } catch (Exception ex) {
        Logger.getLogger(BindTask.class.getName()).log(Level.SEVERE, null, ex);
    }

}

Спасибо за помощь, с наилучшими пожеланиями.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

@ camickr прав (в комментариях).Использование поля со списком для отображения всех полей объекта не имеет особого смысла.Просто переопределите метод toString для вашего объекта, и средство визуализации по умолчанию отобразит его.

Вот как вы это делаете с простым объектом Person (имя, возраст).

package test;

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ObjectsInComboBox extends JFrame {
    public ObjectsInComboBox() {
        super("combo boxes");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        getContentPane().setLayout(new FlowLayout());

        JComboBox<Person> personComboBox = new JComboBox<>();
        getContentPane().add(personComboBox);
        pack();
        personComboBox.addItem(new Person("John", 31));
        personComboBox.addItem(new Person("George", 55));
        personComboBox.addItem(new Person("Mike", 12));
        personComboBox.addItem(new Person("Brian", 36));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            ObjectsInComboBox frame = new ObjectsInComboBox();
            frame.setVisible(true);
        });
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " - " + age; //toString override so renderer can show it.
    }
}
0 голосов
/ 15 мая 2018
for (i = 0; i <= task.size(); i++) 
{
    jComboBoxTask.setModel(new javax.swing.DefaultComboBoxModel<>(
       new String[]{task.get(i).getTaskName(), task.get(i + 1).getTaskName(),

Вы не можете продолжать создавать новую модель. Это означает, что будет отображаться только последнее задание.

Вам необходимо:

  1. установить модель вне цикла
  2. используйте метод addItem(...) поля со списком для добавления каждого элемента.

Хотя я спрашиваю, стоит ли вам вообще использовать поле со списком.

Я бы предложил JTable, который отображает данные в строке и столбцах будет лучше. Прочитайте раздел из учебника по Swing на Как использовать таблицы для получения дополнительной информации.

Edit:

Вы можете хранить любой объект в поле со списком. Средство визуализации по умолчанию просто использует метод toString() объекта для отображения значения в поле со списком.

Таким образом, вы можете добавить объект Task в поле со списком, а затем вам нужно будет создать пользовательский рендер, чтобы отобразить «имя задачи» в поле со списком. См. Combobox With Custom Renderer для получения дополнительной информации по этой теме и простого примера рендерера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...