Java 带有两个jComboxes的Jtable冻结,某些字段变灰,并丢失渲染
使用Netbeans 7.0.1、jDK 6和Toplink Essentials(JPA 1)构建带有Java DB(嵌入式)服务器的Java数据库应用程序。创建了一个主/明细表单,选择“明细区域为文本字段格式”选项(如上所示)。在jTable中添加第二个jcombox时,问题很多。其中一个很好,所以可能是默认的表模型是如何顺序命令的。从第二个组合框中进行选择后,将创建以下错误(无论是哪一个,但导致错误的顺序是第二个): -一旦释放鼠标,应用程序中的某些组件将冻结,而其他组件则不再可选 -下面表单中的一些字段(它们都绑定到表单中的上表)变为灰色,如上图所示,包括注释,它只是一个文本字段,与组合框没有关联,只是绑定到表(命令排序?) -重新启动时,已选择的组合框不再呈现,下面相应的作者/流派字段变为空白 我是一个完全的初学者,在开始这项事业时,我提供了一些教程,包括教这只老狗一些新东西。这个特别的障碍正成为我的报应。每一种新方法都以砰的一声结束。帮助是非常值得的!这是骨头 表格:将所有内容更改为小写,这最终纠正了添加第二个组合框时渲染不起作用的问题。但是,如上所述,一旦选择了第二个组合框中的项目,它就会停止工作Java 带有两个jComboxes的Jtable冻结,某些字段变灰,并丢失渲染,java,user-interface,netbeans,jtable,jcombobox,Java,User Interface,Netbeans,Jtable,Jcombobox,使用Netbeans 7.0.1、jDK 6和Toplink Essentials(JPA 1)构建带有Java DB(嵌入式)服务器的Java数据库应用程序。创建了一个主/明细表单,选择“明细区域为文本字段格式”选项(如上所示)。在jTable中添加第二个jcombox时,问题很多。其中一个很好,所以可能是默认的表模型是如何顺序命令的。从第二个组合框中进行选择后,将创建以下错误(无论是哪一个,但导致错误的顺序是第二个): -一旦释放鼠标,应用程序中的某些组件将冻结,而其他组件则不再可选 -下面
CREATE TABLE app.genres (
id INTEGER NOT NULL
GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1),
genre VARCHAR(20),
CONSTRAINT genre_PK PRIMARY KEY (id)
);
CREATE TABLE app.authors (
id INTEGER NOT NULL
GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1),
firstname VARCHAR(15),
middlename VARCHAR(15),
lastname VARCHAR(15),
CONSTRAINT author_PK PRIMARY KEY (id)
);
CREATE TABLE app.books (
id INTEGER NOT NULL
GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1),
markread VARCHAR(5),
title VARCHAR(100),
authorid INTEGER,
genreid INTEGER,
notes VARCHAR(255),
Constraint book_PK PRIMARY KEY (id)
);
ALTER TABLE app.books ADD CONSTRAINT genre_FK Foreign Key (genreid)
REFERENCES app.genres (id);
ALTER TABLE app.books ADD CONSTRAINT author_FK Foreign Key (authorid)
REFERENCES app.authors (id);
实体类:选择“为持久字段生成命名查询注释”、“生成jaxb注释”-jaxb、“用于重新生成表的属性”和“在关系中使用列名”。将关联提取设置为“急切”,将集合类型设置为“列表”(尽管我尝试了其他设置,但均无效)。
Books实体类需要进行以下更改:
@JoinColumn(name = "GENREID", referencedColumnName = "ID")
@ManyToOne(fetch = FetchType.EAGER)
private Genres genreid;
...
/** delete duplicate
@Column(name = "GENREID")
private Integer genreid;
**/
...
//Replace Integer with Genres, authorsid did not have these errors
public Genres getGenreid() {
return genreid;
}
public void setGenreid(Genres genreid) {
Genres oldGenreid = this.genreid;
this.genreid = genreid;
changeSupport.firePropertyChange("genreid", oldGenreid, genreid);
}
/**deleting the duplicate
public Genres getGenreid() {
return genreid;
}
渲染器:(类型相同,只需少量编辑):
jComboBox:
将属性渲染器更改为匹配类,并将组合框绑定到相应的数据库表
jTable:表内容、列、自定义程序对话框中的更改
-“编辑器”设置:已添加
new DefaultCellEditor(jComboBoxAuthors) --or Genres
- “表达式”:许多教程显示将此更改为 ${genreid.genre}--或作者设置,但。。。 使用一个组合框效果很好,但无法使用两个组合框,因此必须将其设置为默认值
- “Type”:通常会变成字符串,但我放弃了通过customizer对话框设置让两个渲染器工作的尝试,放弃了拼凑一些代码,这意味着将Type更改为以下内容 主要类型(或主要作者)
TableColumn tc = masterTable.getColumnModel().getColumn(2);
TableColumn tc2 = masterTable.getColumnModel().getColumn(3);
DefaultCellEditor de=new DefaultCellEditor(jComboBoxAuthors);
tc.setCellEditor(de);
DefaultCellEditor de2=new DefaultCellEditor(jComboBoxGenres);
tc2.setCellEditor(de2);
}
许多有希望的尝试之一:实现了一个关于如何构建GUI的内容丰富的教程中的操作/侦听器/处理程序步骤,但仍然无法找出如何获得这些步骤来纠正渲染问题。当然,作为一个完全的新手,我的代码可能充满了不必要的错误和遗漏。再次感谢您的帮助先谢谢你
输出:单击combox后
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException
at java.lang.Class.cast(Class.java:3047)
at org.jdesktop.beansbinding.Binding.convertForward(Binding.java:1312)
at org.jdesktop.beansbinding.Binding.getSourceValueForTarget(Binding.java:844)
at org.jdesktop.beansbinding.Binding.refreshUnmanaged(Binding.java:1222)
at org.jdesktop.beansbinding.Binding.refresh(Binding.java:1207)
at org.jdesktop.beansbinding.AutoBinding.tryRefreshThenSave(AutoBinding.java:162)
at org.jdesktop.beansbinding.AutoBinding.sourceChangedImpl(AutoBinding.java:227)
at org.jdesktop.beansbinding.Binding.sourceChanged(Binding.java:1411)
at org.jdesktop.beansbinding.Binding.access$1200(Binding.java:38)
at org.jdesktop.beansbinding.Binding$PSL.propertyStateChanged(Binding.java:1618)
at org.jdesktop.beansbinding.PropertyHelper.firePropertyStateChange(PropertyHelper.java:212)
at org.jdesktop.beansbinding.ELProperty.notifyListeners(ELProperty.java:688)
at org.jdesktop.beansbinding.ELProperty.access$800(ELProperty.java:155)
at org.jdesktop.beansbinding.ELProperty$SourceEntry.processSourceChanged(ELProperty.java:312)
at org.jdesktop.beansbinding.ELProperty$SourceEntry.sourceChanged(ELProperty.java:326)
at org.jdesktop.beansbinding.ELProperty$SourceEntry.propertyChange(ELProperty.java:333)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
at org.jdesktop.swingbinding.adapters.BeanAdapterBase.firePropertyChange(BeanAdapterBase.java:112)
at org.jdesktop.swingbinding.adapters.JTableAdapterProvider$Adapter$Handler.tableSelectionChanged(JTableAdapterProvider.java:81)
at org.jdesktop.swingbinding.adapters.JTableAdapterProvider$Adapter$Handler.valueChanged(JTableAdapterProvider.java:91)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:388)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:398)
at javax.swing.DefaultListSelectionModel.setSelectionInterval(DefaultListSelectionModel.java:442)
at javax.swing.JTable.changeSelectionModel(JTable.java:2347)
at javax.swing.JTable.changeSelection(JTable.java:2416)
at javax.swing.plaf.basic.BasicTableUI$Handler.adjustSelection(BasicTableUI.java:1085)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:1008)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263)
at java.awt.Component.processMouseEvent(Component.java:6411)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
at java.awt.Component.processEvent(Component.java:6179)
at java.awt.Container.processEvent(Container.java:2084)
at java.awt.Component.dispatchEventImpl(Component.java:4776)
at java.awt.Container.dispatchEventImpl(Container.java:2142)
at java.awt.Component.dispatchEvent(Component.java:4604)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4276)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4209)
at java.awt.Container.dispatchEventImpl(Container.java:2128)
at java.awt.Window.dispatchEventImpl(Window.java:2492)
at java.awt.Component.dispatchEvent(Component.java:4604)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717)
at java.awt.EventQueue.access$400(EventQueue.java:82)
at java.awt.EventQueue$2.run(EventQueue.java:676)
at java.awt.EventQueue$2.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:690)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:687)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
为了帮助其他人,我发布了对我有用的东西。注意,这可能不合适,因为我没有编程方面的培训。通过从sqlitestudio.pl/index.rvt?act=download.download和.Created创建了一个NetBeans java应用程序项目。将两个JAR都添加到项目库中。在他创建了一个java类来连接数据库:
public class connectjava {
Connection conn= null;
public static Connection ConnecrDb(){
try {
Class.forName("org.sqlite.JDBC");
Connection conn=DriverManager.getConnection("jdbc:sqlite://ThePathToYourDatabase/TheNameOfYourDatabase.db");
return conn;
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
return null;
}
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
}
创建了JFrame表单。将JTable拖到表单上。添加了以下代码:
public class CollectionBooksTest extends javax.swing.JFrame {
Connection conn, concb, concb2, conck = null;
ResultSet rs = null;
PreparedStatement pst = null;
Statement stcb, stcb2, stck = null;
/** Creates new form CollectionBooks */
public CollectionBooksTest() {
initComponents();
conn = connectjava.ConnecrDb();
PopulateJTable();
}
private void PopulateJTable() {
//jComboBox One part 1/2
Vector cbItems = new Vector();
try {
Class.forName("org.sqlite.JDBC");
concb = DriverManager.getConnection("jdbc:sqlite://ThePathToYourDatabase/TheNameOfYourDatabase.db");
stcb = concb.createStatement();
String sqlcb = "SELECT firstname, middlename, lastname FROM authors ORDER BY lastname ASC";
ResultSet rscb = stcb.executeQuery(sqlcb);
int row = 0;
while ((rscb != null) && (rscb.next())) {
cbItems.add(rscb.getString("firstname") + " " + rscb.getString("middlename") + " " + rscb.getString("lastname"));
}
rscb.close();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if (stcb != null) {
stcb.close();
concb.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
//jComboBox One part 2/2
DefaultComboBoxModel cbm = new DefaultComboBoxModel(cbItems);
final JComboBox cb = new JComboBox(cbm);
//jComboBox Two part 1/2
Vector cb2Items = new Vector();
try {
Class.forName("org.sqlite.JDBC");
concb2 = DriverManager.getConnection("jdbc:sqlite://ThePathToYourDatabase/TheNameOfYourDatabase.db");
stcb2 = concb2.createStatement();
String sqlcb2 = "SELECT genre FROM genres ORDER BY genre ASC";
ResultSet rscb2 = stcb2.executeQuery(sqlcb2);
int row = 0;
while ((rscb2 != null) && (rscb2.next())) {
cb2Items.add(rscb2.getString("genre"));
}
rscb2.close();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if (stcb2 != null) {
stcb2.close();
concb2.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
//jComboBox Two part 2/2
DefaultComboBoxModel cb2model = new DefaultComboBoxModel(cb2Items);
final JComboBox cb2 = new JComboBox(cb2model);
//populate jTable adding comboboxes, etc
String sql = "Select markread as 'Read', title as 'Title', authorid as 'Author', genreid as 'Genre', notes as 'Notes' from books";
try {
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
jTable1_pumpdata.setModel(DbUtils.resultSetToTableModel(rs));
jTable1_pumpdata.setAutoCreateRowSorter(true);
//add checkbox
CheckBoxRenderer rchb = new CheckBoxRenderer();
jTable1_pumpdata.getColumnModel().getColumn(0).setCellRenderer(rchb);
JCheckBox chb = new JCheckBox();
chb.setHorizontalAlignment(JLabel.CENTER);
TableColumn tchb = jTable1_pumpdata.getColumnModel().getColumn(0);
DefaultCellEditor e = new DefaultCellEditor(chb);
tchb.setCellEditor(e);
//add comboboxes
TableColumn tcb = jTable1_pumpdata.getColumnModel().getColumn(2);
DefaultCellEditor e2 = new DefaultCellEditor(cb);
tcb.setCellEditor(e2);
TableColumn tcb2 = jTable1_pumpdata.getColumnModel().getColumn(3);
DefaultCellEditor e3 = new DefaultCellEditor(cb2);
tcb2.setCellEditor(e3);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
} finally {
try {
rs.close();
pst.close();
} catch (Exception e) {
}
}
}
对于那些对复选框感兴趣的人。在代码末尾添加了一个渲染器:
private class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
CheckBoxRenderer() {
setHorizontalAlignment(JLabel.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelected((value != null && ((Boolean) value).booleanValue()));
return this;
}
}
}
private class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
CheckBoxRenderer() {
setHorizontalAlignment(JLabel.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelected((value != null && ((Boolean) value).booleanValue()));
return this;
}
}
}