繁体   English   中英

JTable中的JComboBox显示无效数据

[英]JComboBox in JTable display invalid data

我有一个JTable ,可根据数据库select查询动态填充其列。 JTable一列将接受JComboBox 现在,请看下面的代码。

private class ViewClientsDisplayData extends ComponentAdapter
     {
        @Override
        public void componentShown(ComponentEvent e) 
        {
            dbConnector = new DBHandler();
            dbConnector.makeConnection();

            ResultSet rs =  dbConnector.selectAllDetails("select client_id, Name from Client");

            DefaultTableModel model = (DefaultTableModel) ViewClientsTable.getModel();
            model.setRowCount(0);

            try {
                if(rs.isBeforeFirst()==false)
                {
                    JOptionPane.showMessageDialog(null,"The table is empty");
                }
                else
                {
                    try
                    {
                        while(rs.next())
                        {
                            int id = rs.getInt("client_id");
                            String name = rs.getString("Name");

                            ResultSet getPortfolios =  dbConnector.selectAllDetails("select portfolio_id from Portfolio where Client_Name = '"+name+"'");
                            JComboBox combo = new JComboBox();
                            combo.removeAllItems();

                            while(getPortfolios.next())
                            {
                                combo.addItem(getPortfolios.getString("portfolio_id"));
                            }

                            JButton update = new JButton("Update");
                            JButton delete = new JButton("Delete");

                            JPanel btnPanel = new JPanel();
                            btnPanel.setLayout(new FlowLayout());
                            btnPanel.add(update);
                            btnPanel.add(delete);


                            Object[]row = {id, name, 0, "", new ButtonColumn(ViewClientsTable,null,"delete",4)};

                            model.addRow(row);
                            ViewClientsTable.getColumn("Portfolio").setCellEditor(new DefaultCellEditor(combo));

                        }
                        dbConnector.closeConnection();
                    }
                    catch(SQLException sqlE)
                    {
                        sqlE.printStackTrace();
                        JOptionPane.showMessageDialog(null,sqlE.getLocalizedMessage());
                        dbConnector.closeConnection();
                    }
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
     }

dbConnector.selectAllDetails()方法

public ResultSet selectAllDetails(String query)
    {
        ResultSet r = null;
        try
        {
            Statement st = con.createStatement();

            r = st.executeQuery(query);
        }
        catch(SQLException sql)
        {
            sql.printStackTrace();
        }

        return r;
    }

这里的问题是我的JComboBox没有按预期装满。 它应该基于提供的搜索查询填充数据,但是,它在所有行中显示相同的项目,项目03是客户名称AAA的投资组合ID。

下面是我的client表(带有虚拟输入)

在此处输入图片说明

以下是我的Portfolio表(带有虚拟输入)

在此处输入图片说明

为什么会这样呢? 为什么JComboBox不显示相关数据,而是重复相同的数据?

PS:我知道我们不应该根据name搜索,而应该从``唯一ID''搜索,但这是SO帖子的快速编辑。

首先将数据从视图中分离出来,模型数据绝不应包含任何类型的UI组件或与UI相关的信息。 做出这些决定不是模型的责任。 该模型承载数据,仅此而已。

表中的单个单元格仅包含一个值,无论该值可能设置为什么。 它只能携带一个状态或值。

值在屏幕上的表示方式是渲染器的域,值的修改方式是编辑器的域。

构建您的TableModel并将其填充数据,然后将其传递给JTable ,该JTable已配置了所需的渲染器和编辑器以显示和编辑您的数据...

表格编辑器

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

public class TableComboBox {

    public static void main(String[] args) {
        new TableComboBox();
    }

    public TableComboBox() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D"}, 5);
                JTable table = new JTable(model);

                JComboBox bCombo = new JComboBox(new Object[]{"Apples", "Bannans", "Pears", "Grapes"});
                JComboBox cCombo = new JComboBox(new Object[]{"Elephants", "Monkeys", "Cats", "Dogs"});
                JComboBox dCombo = new JComboBox(new Object[]{"Unicorns", "Dragons", "Pixis", "Blobs"});

                DefaultCellEditor bEditor = new DefaultCellEditor(bCombo);
                DefaultCellEditor cEditor = new DefaultCellEditor(cCombo);
                DefaultCellEditor dEditor = new DefaultCellEditor(dCombo);

                TableColumnModel cm = table.getColumnModel();
                cm.getColumn(1).setCellEditor(bEditor);
                cm.getColumn(2).setCellEditor(cEditor);
                cm.getColumn(3).setCellEditor(dEditor);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

看一看如何使用表使用其他编辑器概念:编辑器和渲染器了解更多详细信息

如果要在JTable中显示此JCombobox,则应基于该行在JComboBox中设置正确的值。 为此,我通常使用我扩展的AbstractTableModel。 在方法getValue中,当您获得rowindex和columnindex时,应使用行索引正确地初始化JComboBox。 Als为每个显示的行使用单独的JComboBox。

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Object value = null;
    if(rowIndex > rows.size())
        return null;
    Item item = rows.get(rowIndex);

    switch (columnIndex) {
    case 0: //Your combobox
        JComboBox value= new JComboBox(listitems);
        jc.setSelectedItem(item.name);
        break;

.......

    return value;
}

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM