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