gpt4 book ai didi

java - JTable中的JComboBox显示无效数据

转载 作者:行者123 更新时间:2023-12-01 22:43:31 24 4
gpt4 key购买 nike

我有一个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 .

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

enter image description here

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

enter image description here

为什么会发生这种情况?为什么JComboBox不是显示相关数据,而是重复相同的数据?

PS:我知道我们不应该根据 name 进行搜索但我们应该从“唯一 id”进行搜索,但这是对 SO 帖子的快速编辑。

最佳答案

首先将数据与其 View 分开,模型数据不应包含任何类型的 UI 组件或 UI 相关信息。做出这些决定不是模型的责任。模型携带数据,仅此而已。

表格中的单个单元格仅包含单个值,无论其设置为何。它只携带一个状态或值。

如何在屏幕上表示值是渲染器的领域,如何修改值是编辑器的领域。

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

TableEditor

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);
}
});
}
}

看看How to Use Tables , Using Other Editors ,和Concepts: Editors and Renderers了解更多详情

关于java - JTable中的JComboBox显示无效数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25718590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com