首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JComboBox + JPA

JComboBox + JPA
EN

Stack Overflow用户
提问于 2011-03-11 16:18:48
回答 2查看 1.6K关注 0票数 1

考虑到Java的持久性API和JComboBox,我现在被一个java问题卡住了。

问题如下:

我有一个JDialog,我用它来向数据库添加一些东西。

在视图中:

代码语言:javascript
复制
cbGenre = new JComboBox();
cbPublisher = new JComboBox();

我想要的是,在这两个组合框中,从列表或ArrayList中加载值。据我所知,Standard是一个只接受字符串数组的组合框。我还发现了一个使用ArrayList的例子,我可以和他一起工作。

现在主要的问题是:

我有两个表(只列出重要的列):

代码语言:javascript
复制
games
id pk int
genre int

genre
id pk int
name varchar

它们通过JPA以M:1的关系连接起来

所以一个游戏只能有一种类型

一个类型可以有一个或多个游戏

如何在适当的组合框中添加检索到的流派名称,当我按下保存按钮时,将检索组合框中名称的id和该名称的id?

这是否可以通过ArrayList实现,或者JCombobox不允许值对?我想要这样做的原因是,当我将游戏保存到数据库时,我需要具有选定的流派id并将其添加到数据库中,显然,用户不应该看到id,而是Action或RPG等。

如果我的问题有点不清楚,很抱歉。如果是,请告诉我,这样我可以更好地解释它。

英语不是我的母语,你可能已经注意到了:)

感谢您的阅读,我希望能尽快找到解决方案。在此期间,我将通过google浏览更多

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-11 16:34:18

组合框可以接受任何类型的对象。为了显示它们的值,它使用对象的toString()方法。所以,你可能会有这样的代码:

代码语言:javascript
复制
@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的组合框而不是流派的组合框

代码语言:javascript
复制
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 tutorial,并阅读您正在使用的swing组件的javadoc。

票数 4
EN

Stack Overflow用户

发布于 2011-03-11 16:37:22

您似乎没有理解关于Swing的一件非常重要的事情。据我所知,它是真正的MVC最好的实现之一(而不是web MVC2在我心目中的折磨)。

因此,每个Swing组件都可以使用经典的MVC习惯用法来定义。

举个例子,对于你的JComboBox,你有

  • one视图:JComboBox本身
  • one模型:ComboBoxModel,在大多数情况下,它是从您提供给它的字符串数组实例化的
  • 一组控制器:您创建的各种事件处理程序,用于处理视图中的各种事件。

<ComboBoxModel>F29

然而,在另一个层次上,组件扮演着其他角色。如果您检查了项目呈现,则可以说您拥有

控制器one模型:ComboBoxModel

  • one控制器:JComboBox

  • one视图:用于显示

的那些元素的ListCellRenderer

回到您的问题,让我们假设您更改了games组合框模型,以保存游戏对象,而不是字符串。然后,您的组合框将显示类似Game@1548ea8的字符串,然后您可以使用正确的ListCellRenderer对其进行更改。

在这种情况下,调用JComboBox#getSelectedItem()会返回给你一个直接可用的游戏。

如果你对你的风格组合框做同样的事情,我想关联代码会更容易写。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5270513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档