Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有两个jComboxes的Jtable冻结,某些字段变灰,并丢失渲染_Java_User Interface_Netbeans_Jtable_Jcombobox - Fatal编程技术网

Java 带有两个jComboxes的Jtable冻结,某些字段变灰,并丢失渲染

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时,问题很多。其中一个很好,所以可能是默认的表模型是如何顺序命令的。从第二个组合框中进行选择后,将创建以下错误(无论是哪一个,但导致错误的顺序是第二个): -一旦释放鼠标,应用程序中的某些组件将冻结,而其他组件则不再可选 -下面

使用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;
    }
}
}