考虑到Java的持久性API和JComboBox,我现在被一个java问题卡住了。
问题如下:
我有一个JDialog,我用它来向数据库添加一些东西。
在视图中:
cbGenre = new JComboBox();
cbPublisher = new JComboBox();我想要的是,在这两个组合框中,从列表或ArrayList中加载值。据我所知,Standard是一个只接受字符串数组的组合框。我还发现了一个使用ArrayList的例子,我可以和他一起工作。
现在主要的问题是:
我有两个表(只列出重要的列):
games
id pk int
genre int
genre
id pk int
name varchar它们通过JPA以M:1的关系连接起来
所以一个游戏只能有一种类型
一个类型可以有一个或多个游戏
如何在适当的组合框中添加检索到的流派名称,当我按下保存按钮时,将检索组合框中名称的id和该名称的id?
这是否可以通过ArrayList实现,或者JCombobox不允许值对?我想要这样做的原因是,当我将游戏保存到数据库时,我需要具有选定的流派id并将其添加到数据库中,显然,用户不应该看到id,而是Action或RPG等。
如果我的问题有点不清楚,很抱歉。如果是,请告诉我,这样我可以更好地解释它。
英语不是我的母语,你可能已经注意到了:)
感谢您的阅读,我希望能尽快找到解决方案。在此期间,我将通过google浏览更多
发布于 2011-03-11 16:34:18
组合框可以接受任何类型的对象。为了显示它们的值,它使用对象的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 tutorial,并阅读您正在使用的swing组件的javadoc。
发布于 2011-03-11 16:37:22
您似乎没有理解关于Swing的一件非常重要的事情。据我所知,它是真正的MVC最好的实现之一(而不是web MVC2在我心目中的折磨)。
因此,每个Swing组件都可以使用经典的MVC习惯用法来定义。
举个例子,对于你的JComboBox,你有
JComboBox本身ComboBoxModel,在大多数情况下,它是从您提供给它的字符串数组实例化的<ComboBoxModel>F29
然而,在另一个层次上,组件扮演着其他角色。如果您检查了项目呈现,则可以说您拥有
控制器one模型:ComboBoxModel
JComboBox
的那些元素的ListCellRenderer
回到您的问题,让我们假设您更改了games组合框模型,以保存游戏对象,而不是字符串。然后,您的组合框将显示类似Game@1548ea8的字符串,然后您可以使用正确的ListCellRenderer对其进行更改。
在这种情况下,调用JComboBox#getSelectedItem()会返回给你一个直接可用的游戏。
如果你对你的风格组合框做同样的事情,我想关联代码会更容易写。
https://stackoverflow.com/questions/5270513
复制相似问题