簡體   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