填充JTable时重复的值 [英] Values repeating when Populating a JTable
问题描述
我有一个JTable.并且我已经在这种方法中将列添加到了它.
I have a JTable. And I've added the column to it within a method like this.
private void createSearchResultTable() {
DefaultTableColumnModel columnModel = new DefaultTableColumnModel();
String columnNames[] = {"Title", "Author", "Edition", "Availability", "Reserve"};
for (int i = 0; i < columnNames.length; i++) {
TableColumn column = new TableColumn();
column.setHeaderValue(columnNames[i]);
columnModel.addColumn(column);
}
tblBookSearchResults.setColumnModel(columnModel);
ButtonColumn buttonColumn = new ButtonColumn(tblBookSearchResults, reserveBook, 4);
buttonColumn.setMnemonic(KeyEvent.VK_ENTER);
}
现在,我用从MySQL数据库检索到的数据填充JTable.
Now I'm populating the JTable with data retrieved from a MySQL database.
private boolean populateSearchResultTable(String title, String author, String publisher) {
con = DatabaseHandler.connectToDb();
try {
if (title.trim().length() != 0) {
pst = con.prepareStatement("SELECT title, author, edition, status FROM book WHERE title LIKE ? ");
pst.setString(1, "%" + title + "%");
}
else if (author.trim().length() != 0) {
// Say, this query is getting executed
pst = con.prepareStatement("SELECT title, author, edition, status FROM book WHERE author LIKE ? ");
//pst.setString(1, "%" + author + "%");
pst.setString(1, "Dan");
}
else if (publisher.trim().length() != 0) {
pst = con.prepareStatement("SELECT title, author, edition, status FROM book WHERE publisher LIKE ? ");
pst.setString(1, "%" + publisher + "%");
}
rs = pst.executeQuery();
int rowNum = 0;
while (rs.next()) {
tblBookSearchResults.setValueAt(rs.getString(1), rowNum, 1);
}
return true;
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getLocalizedMessage());
}
finally {
}
return false;
}
检索数据集没有问题,但是当我将值设置为JTable时,它看起来像这样.
The data set is retrieved without an issue but when I'm setting the values to the JTable, it looks like this.
第一个值在所有列中重复.我不知道为什么会这样?任何有关如何纠正此问题的建议将不胜感激.
The first value gets repeated in all columns. I can't figure out why this is happening? Any suggestion on how to correct this would be appreciated.
谢谢.
推荐答案
在更新JTable
时不要使用JTable#setValue
,而是在模型中添加新行或修改现有行.
Don't use JTable#setValue
when updating a JTable
, instead, add new rows or modify existing rows through the model.
此外,您并没有增加rowNum
的值,因此您始终与表格的第一行进行交互
Also, you're not incrementing the rowNum
value, so you're always interacting with the first row of the table
简单示例
使用Swing Timer
向模型添加新行的简单示例...
A simple example that uses a Swing Timer
to add a new row to the model...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TestTableModel01 {
public static void main(String[] args) {
new TestTableModel01();
}
public TestTableModel01() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D", "E"}, 0);
JTable table = new JTable(model);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (model.getRowCount() < 100) {
int row = model.getRowCount();
model.addRow(new Object[]{
row + "x" + 0,
row + "x" + 1,
row + "x" + 2,
row + "x" + 3,
row + "x" + 4
});
} else {
((Timer)(e.getSource())).stop();
}
}
});
timer.start();
}
});
}
}
这篇关于填充JTable时重复的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!