java - 与一个 JTable 相关的多个 Jcombo 框

标签 java swing jtable jcombobox

<分区>

我对 JComboBoxJTable 有疑问。

在项目中,我有 3 个 JComboBox 和一个 JTable,我希望每次从 JComboBox 中选择一个项目时将数据库中的一些数据放入表中,但在运行代码后,我注意到只有当我从第一个 JComboBox 中选择一个项目时,我已将其绑定(bind)到 JTable 首先,数据可以从数据库中获取。

我的问题是:我只能将一个 JComboBox 绑定(bind)到一个 JTable 吗?

我对所有 3 个 JComboBox 使用了相同的代码。

package tutorial;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.swing.*;
import java.sql.*;
import net.proteanit.sql.DbUtils;

public class Lista extends javax.swing.JFrame implements ActionListener, Runnable {
Connection conn;
public Lista() {
    initComponents();
    this.setSize(800,400);
    this.setResizable(false);  
}
// creates the components                    
private void initComponents() {
    bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
    tfSearch = new javax.swing.JTextField();
    bSearch = new javax.swing.JButton();
    lbAutor = new javax.swing.JLabel();
    cboxAutor = new javax.swing.JComboBox();
    cboxCategorie = new javax.swing.JComboBox();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    cboxLibrarie = new javax.swing.JComboBox();
    cbEditura = new javax.swing.JComboBox();
    lbCategorie = new javax.swing.JLabel();
    lbLibrarie = new javax.swing.JLabel();
    lbEditura = new javax.swing.JLabel();
    jLabel1 = new javax.swing.JLabel();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    getContentPane().setLayout(null);
    tfSearch.setFont(new java.awt.Font("Arial Black", 1, 18)); // NOI18N
    tfSearch.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyReleased(java.awt.event.KeyEvent evt) {
            tfSearchKeyReleased(evt);
        }
    });
    getContentPane().add(tfSearch);
    tfSearch.setBounds(60, 40, 200, 30);
    bSearch.setBackground(new java.awt.Color(255, 255, 255));
    bSearch.setFont(new java.awt.Font("Arial Black", 1, 14)); // NOI18N
    bSearch.setText("Search");
    bSearch.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            bSearchActionPerformed(evt);
        }
    });
    getContentPane().add(bSearch);
    bSearch.setBounds(270, 40, 90, 30);
    lbAutor.setFont(new java.awt.Font("Arial Black", 3, 18)); // NOI18N
    lbAutor.setForeground(new java.awt.Color(255, 255, 255));
    lbAutor.setText("Autor:");
    getContentPane().add(lbAutor);
    lbAutor.setBounds(440, 120, 100, 20);
    cboxAutor.setBackground(new java.awt.Color(255, 153, 51));
    cboxAutor.setFont(new java.awt.Font("Arial Black", 1, 14)); // NOI18N
    cboxAutor.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Cristie", "Bronte", "Tolkien", "Meyer", "Van Vogt", "Pavel", "Inoue", "Austen", "Bromte", "Eminescu" }));
    cboxAutor.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            cboxAutorItemStateChanged(evt);
        }
    });
    cboxAutor.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            cboxAutorActionPerformed(evt);
        }
    });
    getContentPane().add(cboxAutor);
    cboxAutor.setBounds(560, 120, 220, 30);
    cboxCategorie.setBackground(new java.awt.Color(255, 153, 51));
    cboxCategorie.setFont(new java.awt.Font("Arial Black", 1, 14)); // NOI18N
    cboxCategorie.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Literatura de Dragoste", "Literatura Fantastica", "Literatura Politista", "Literatura SF", "Literatura Psihologica" }));
    org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, jTable1, org.jdesktop.beansbinding.ELProperty.create("mesajjjjj"), cboxCategorie, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
    bindingGroup.addBinding(binding);
    cboxCategorie.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            cboxCategorieItemStateChanged(evt);
        }
    });
    cboxCategorie.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            cboxCategorieActionPerformed(evt);
        }
    });
    getContentPane().add(cboxCategorie);
    cboxCategorie.setBounds(560, 240, 220, 30);
    jTable1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(255, 204, 204), 1, true));
    jTable1.setFont(new java.awt.Font("Arial Black", 1, 14)); // NOI18N
    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
        },
        new String [] {
        }
    ));
    jTable1.setDoubleBuffered(true);
    jScrollPane1.setViewportView(jTable1);
    getContentPane().add(jScrollPane1);
    jScrollPane1.setBounds(60, 100, 340, 230);
    cboxLibrarie.setBackground(new java.awt.Color(255, 153, 51));
    cboxLibrarie.setFont(new java.awt.Font("Arial Black", 1, 14)); // NOI18N
    cboxLibrarie.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Librarium", "Humanitas", "Carturesti", "Alpha", "Diverta", "Pheonix" }));
    cboxLibrarie.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            cboxLibrarieActionPerformed(evt);
        }
    });
    getContentPane().add(cboxLibrarie);
    cboxLibrarie.setBounds(560, 200, 220, 30);
    cbEditura.setBackground(new java.awt.Color(255, 153, 51));
    cbEditura.setFont(new java.awt.Font("Arial Black", 1, 14)); // NOI18N
    cbEditura.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Corint-Junior", "Gramar", "Albastra", "Teora", "Mega", "Mediamira", "U.T. PRESS" }));
    cbEditura.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            cbEdituraItemStateChanged(evt);
        }
    });
    cbEditura.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            cbEdituraActionPerformed(evt);
        }
    });
    getContentPane().add(cbEditura);
    cbEditura.setBounds(560, 160, 220, 30);
    lbCategorie.setFont(new java.awt.Font("Arial Black", 3, 18)); // NOI18N
    lbCategorie.setForeground(new java.awt.Color(255, 255, 255));
    lbCategorie.setText("Categorie:");
    getContentPane().add(lbCategorie);
    lbCategorie.setBounds(440, 240, 120, 30);
    lbLibrarie.setFont(new java.awt.Font("Arial Black", 3, 18)); // NOI18N
    lbLibrarie.setForeground(new java.awt.Color(255, 255, 255));
    lbLibrarie.setText("Librarie:");
    getContentPane().add(lbLibrarie);
    lbLibrarie.setBounds(440, 200, 120, 30);
    lbEditura.setFont(new java.awt.Font("Arial Black", 3, 18)); // NOI18N
    lbEditura.setForeground(new java.awt.Color(255, 255, 255));
    lbEditura.setText("Editura:");
    getContentPane().add(lbEditura);
    lbEditura.setBounds(440, 160, 130, 30);
    jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/lis.jpg"))); // NOI18N
    getContentPane().add(jLabel1);
    jLabel1.setBounds(0, 0, 790, 370);
    bindingGroup.bind();
    pack();
}// </editor-fold> 
//end initComponents


private void cboxLibrarieItemStateChanged(java.awt.event.ActionEvent evt) {                                             

    try{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost/proiectibd";
        conn =DriverManager.getConnection(url, "root", "");
        String sql;
        sql = "select Titlul_cartii,Data_publicatie,Pret from carte,librarie,arhiva where librarie.idLibrarie=arhiva.librarie_idLibrarie and carte.idCarte=arhiva.Carte_idCarte and nume_librarie=?";
        PreparedStatement ps;
        ps = conn.prepareStatement(sql);
        ps.setString(1,(String)cboxAutor.getSelectedItem());
        ResultSet rs=ps.executeQuery();
        jTable1.setModel(DbUtils.resultSetToTableModel (rs));
    }
    catch(Exception e){
        //JOptionPane.showMessageDialog(null,e);
    }
}                                            

//only this JComboBox works
private void cboxAutorItemStateChanged(java.awt.event.ItemEvent evt) {    
    try{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost/proiectibd";
        conn =DriverManager.getConnection(url, "root", "");
        String sql;
        sql = "select Titlul_cartii,Data_publicatie,Pret from carte,autor where carte.autor_idautor=autor.idAutor and Nume_Autor=?";
        PreparedStatement ps;
        ps = conn.prepareStatement(sql);
        ps.setString(1,cboxAutor.getSelectedItem().toString());
        ResultSet rs=ps.executeQuery();
        jTable1.setModel(DbUtils.resultSetToTableModel (rs));
    }
    catch(Exception e){
        //JOptionPane.showMessageDialog(null,e);
    }
}                   

private void cbEdituraItemStateChanged(java.awt.event.ItemEvent evt) {                                           
    try{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost/proiectibd";
        conn4 =DriverManager.getConnection(url, "root", "");
        String sql;
        sql = "select Titlul_cartii,Data_publicatie,Pret from carte,editura,contact where editura.ideditura=contact.editura_ideditura and carte.idCarte=contact.Carte_idCarte and nume_editura=?";
        PreparedStatement ps;
        ps = conn4.prepareStatement(sql);
        ps.setString(1,cboxAutor.getSelectedItem().toString());
        ResultSet rs=ps.executeQuery();
        jTable1.setModel(DbUtils.resultSetToTableModel (rs));
    }
    catch(Exception e){
        //JOptionPane.showMessageDialog(null,e);
    }
}                                          

private void cboxCategorieItemStateChanged(java.awt.event.ItemEvent evt) {                                               
    try{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost/proiectibd";
        conn =DriverManager.getConnection(url, "root", "");
        String sql;
        sql = "select Titlul_cartii,Data_publicatie,Pret from carte,categorii where carte.Categorii_idCategorii=categorii.idCategorii and Nume_categorie=?";
        PreparedStatement ps;
        ps = conn.prepareStatement(sql);
        ps.setString(1,cboxAutor.getSelectedItem().toString());
        ResultSet rs=ps.executeQuery();
        jTable1.setModel(DbUtils.resultSetToTableModel (rs));

    }

    catch(Exception e){
        //JOptionPane.showMessageDialog(null,e);
    }
}  

// Variables declaration - do not modify                     
private javax.swing.JButton bSearch;
private javax.swing.JComboBox cbEditura;
private javax.swing.JComboBox cboxAutor;
private javax.swing.JComboBox cboxCategorie;
private javax.swing.JComboBox cboxLibrarie;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
private javax.swing.JLabel lbAutor;
private javax.swing.JLabel lbCategorie;
private javax.swing.JLabel lbEditura;
private javax.swing.JLabel lbLibrarie;
private javax.swing.JTextField tfSearch;
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration                   

@Override
public void actionPerformed(ActionEvent e) {
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void run() {
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

最佳答案

好吧,让我们尝试系统地完成这个......

空布局...

避免使用 null 布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,没有一个是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

KeyListener 文本组件...

在文本组件上放置 KeyListener 从来都不是真正好的理由。如果您想知道字段何时更新,请改用 DocumentListener;如果您想修改/过滤用户输入字段的内容,请使用 DocumentFilter;如果您想知道用户何时按下 Enter 键,请使用 ActionListener

您当前的方法也确实不健康,每次释放 key 时尝试执行新请求可能会导致您的程序在发出请求时卡住或卡顿,它也会执行不必​​要的请求。

相反,使用 DocumentListener 的组合来检测字段的变化和 javax.swing.Timer 在更新之间注入(inject)一个小的延迟,重新启动计时器每次 DocumentListener 收到更改通知。一旦计时器实际触发,您就应该执行请求。

组合框更新...

您似乎复制并粘贴了代码,因为在 cboxLibrarieItemStateChangedcbEdituraItemStateChangedcboxCategorieItemStateChanged 方法中,您使用的是来自 cboxAutor 的值...

ps.setString(1,cboxAutor.getSelectedItem().toString());

您需要为要搜索的字段使用正确的组合框...

资源管理

您没有很好地管理您的资源,让连接和其他数据库资源处于打开状态,这可能会随着时间的推移降低性能...

从 Java 7 开始,它变得非常易于管理...

try{
    Class.forName("com.mysql.jdbc.Driver");
    String url="jdbc:mysql://localhost/proiectibd";
    try (Connection conn = DriverManager.getConnection(url, "root", "")) {
        String sql = "select Titlul_cartii,Data_publicatie,Pret from carte,autor where carte.autor_idautor=autor.idAutor and Nume_Autor=?";
        try (PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setString(1,cboxAutor.getSelectedItem().toString());
            try (ResultSet rs=ps.executeQuery()) {
                jTable1.setModel(DbUtils.resultSetToTableModel (rs));
            }
        }
    }
} catch(SQLException e){
    e.printStackTrace();// At the very least...
    //JOptionPane.showMessageDialog(null,e);
}

参见 The try-with-resources Statement了解更多详情。

关于java - 与一个 JTable 相关的多个 Jcombo 框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759691/

相关文章:

java - 定时器和带有图像的 JSlider

java - 将处理应用程序组合成一个大的可执行文件?

java - 自定义三星健康应用程序问题?

java - 使用 Spring 问题制作带有菜单栏的 Swing 框架

java - 我的 Jar 应用程序(myapplication.jar + Mysql 连接器)无法在其他计算机上运行

java - 根据前一行 JXTreeTable 中的值绘制单元格某些颜色

java - JTable 中鼠标单击引起的多个焦点事件

java - 尝试将 double[][] 数组输入到 JTable 中

java - Android - 在本地存储 'large' 数据

java - GWT/GPE/App Engine : How to (intelligently) find missing . jar 并将它们复制到/WEB-INF/lib 吗?