JComboBox + JPA - PullRequest
       24

JComboBox + JPA

1 голос
/ 11 марта 2011

В настоящее время я застрял в проблеме с Java, учитывая API устойчивости Java и JComboBox.

Проблема заключается в следующем:

У меня есть JDialog, который я использую для добавления чего-либо в базу данных.

По виду:

cbGenre = new JComboBox();
cbPublisher = new JComboBox();

Я хочу, чтобы в этих 2 полях со списком были загружены значения из List или ArrayList. Стандарт, из того, что я узнал, был комбинированным списком, принимающим только массив String. Я также нашел один пример, который использует ArrayList, с которым я могу работать.

Теперь главный вопрос:

У меня есть 2 таблицы (будут перечислены только важные столбцы):

games
id pk int
genre int

genre
id pk int
name varchar

Они связаны через JPA в отношении M: 1

так что в одной игре может быть только один жанр
один жанр может иметь одну или несколько игр

Как я собираюсь добавить полученные имена жанров в соответствующий комбинированный список, и когда я нажимаю кнопку сохранения, получаю как идентификатор имени в комбинированном ящике, так и идентификатор этого имени?

Возможно ли это через ArrayList или JCombobox не допускает пар значений? Причина, по которой я этого хочу, в том, что когда я сохраняю игру в базе данных, мне нужно иметь идентификатор выбранного жанра и добавлять его в базу данных, и, очевидно, пользователь должен видеть не идентификатор, а скорее действие или RPG и что нет.

Извините, если мой вопрос немного неясен. Если это так, пожалуйста, скажите мне, чтобы я мог попытаться объяснить это лучше.

Английский не мой родной язык, который вы, наверное, уже заметили:)

Спасибо за чтение, и я надеюсь найти решение в ближайшее время. В то же время плохо просматривать Google еще немного

Ответы [ 2 ]

4 голосов
/ 11 марта 2011

Поле со списком принимает любые виды объектов. Для отображения их значения используется метод объектов tht toString (). Итак, вы можете иметь этот код:

@Entity
public class Genre {
    // fields and methods

    @Override 
    public String toString() {
        return this.name;
    }
}

// in your GUI
List<Genre> genres = findAllGenresSortedByName();
this.cbGenre = new JComboBox(genres.toArray());
// ...
Genre selectedGenre = (Genre) this.cbGenre.getSelectedItem();

Если в Genre уже есть метод toString, который вы не хотите изменять, вы можете заключить жанр в выделенный класс, используемый для графического интерфейса пользователя, и использовать поле со списком GenreWrappers, а не поле со списком жанров

public class GenreWrapper {
    private Genre genre;

    public GenreWrapper(Genre genre) {
        this.genre = genre;
    }

    @Override
    public String toString() {
        return this.genre.getName();
    }

    public Genre getGenre() {
        return this.genre;
    }
}

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

2 голосов
/ 11 марта 2011

Вы, кажется, не поняли очень важную вещь о Swing. Насколько я знаю, это одна из лучших реализаций реального MVC (в отличие от пыток, которые, на мой взгляд, веб-MVC2).

следовательно, каждый компонент Swing может быть определен с использованием классической идиомы MVC.

Например, для вашего JComboBox у вас есть

  • один вид: JComboBox сам
  • одна модель: ComboBoxModel, которая в большинстве случаев создается из массива строк, который вы ей предоставляете
  • набор контроллеров: различные обработчики событий, созданные вами для воздействия на различные события в представлении.

Однако на другом уровне компоненты играют другие роли. Если вы изучите визуализацию предмета, вы можете сказать, что у вас есть

  • одна модель: ComboBoxModel
  • один контроллер: JComboBox
  • один вид: ListCellRenderer, используемый для отображения этих элементов

Чтобы вернуться к вашей проблеме, давайте предположим, что вы изменили свою модель games, чтобы она содержала не строки, а игровые объекты. Ваше поле со списком будет отображать строки, такие как Game@1548ea8, которые вы можете изменить, используя правильный ListCellRenderer.

В этом случае, позвонив по номеру JComboBox#getSelectedItem(), вы получите доступную для использования игру.

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

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