[英]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.