【问题标题】:Values repeating when Populating a JTable填充 JTable 时重复的值
【发布时间】:2013-05-05 22:57:30
【问题描述】:

我有一个 JTable。我已经在这样的方法中添加了该列。

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。

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 时,它​​看起来像这样。

第一个值在所有列中重复。我不明白为什么会这样?任何有关如何纠正此问题的建议将不胜感激。

谢谢。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖 SSCCE。硬编码一些数据。

标签: java mysql swing jtable populate


【解决方案1】:

更新JTable时不要使用JTable#setValue,而是通过模型添加新行或修改现有行。

此外,您不会增加 rowNum 的值,因此您始终与表格的第一行进行交互

简单示例

一个使用 Swing Timer 向模型添加新行的简单示例...

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

【讨论】:

  • 我对 Java 很陌生,所以我不太熟悉使用您提到的这种模型。你能详细说明一下吗?并感谢您指出递增的错误。我更正了,但现在看起来像 this
  • 看看How to use Tables。 Swing 采用了 MVC(模型、控件、视图)范式的一种形式,将视图/控件与模型分离
  • 嗨!我在你的例子的帮助下试过了。数据正在加载,除非将表添加到 JFrame 部分存在一个问题。在上面的代码示例中,它创建了一个全新的JFrame,对吧?我想将该表添加到现有的JFrameHere's 到目前为止我的代码。目前只显示表单减去表格。
  • 示例代码中没有任何内容表明存在任何问题。除非您在其他地方向框架添加其他组件...
  • hmm...虽然我没有添加任何其他控件。只有JFrame 是由设计器创建的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2017-12-29
  • 2020-02-21
  • 2015-06-19
  • 2018-12-14
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多