iteye_18482 2008-08-14 19:20
浏览 256
已采纳

对数据库执行一个查询,把获得的结果集通过JTable显示,当查询变化时,如何使JTable的内容变化

对数据库执行一个查询,把获得的结果集通过JTable显示,当查询变化时,如何使JTable的显示内容随之变化。



我查阅了一些资料,如果不是操作数据库,JTable的validate()和updateUI()可以更新JTable的显示内容,可对数据库操作时,这两个方法好像就不起作用了。

  • 写回答

1条回答 默认 最新

  • iteye_14762 2008-08-14 21:33
    关注

    JTable的实现是基于MVC的, 所以JTabel的数据显示是一个独立的model的, JTable#setModel(TableModel dataModel)就是来设置model的, 所以你如果想动态显示数据, 你需要实现一个TableModel, 下面以一个User对象为例来说明这个情况!User可能来自你的数据库查询, 也就是一个实体:
    [code="java"]
    class User {
    private String id;
    private String name;
    public User() {
    }
    public User(String id, String name) {
    this.id = id;
    this.name = name;
    }
    public String getId() {
    return id;
    }
    public void setId(String id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    }
    [/code]
    下面是实现的一个TableModel:
    [code="java"]
    class UserTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    // 保存一个User的列表
    private List users = new ArrayList();
    // 设置User列表, 同时通知JTabel数据对象更改, 重绘界面
    public void setUsers(List users) {
    this.users = users;
    this.fireTableDataChanged();// 同时通知JTabel数据对象更改, 重绘界面
    }
    public int getColumnCount() {
    return 2;
    }
    public int getRowCount() {
    return users.size();
    }
    // 从list中拿出rowIndex行columnIndex列显示的值
    public Object getValueAt(int rowIndex, int columnIndex) {
    User user = users.get(rowIndex);
    if (columnIndex == 0) {
    return user.getId();
    } else {
    return user.getName();
    }
    }
    }
    [/code]
    可以写一个main方法测试一下:
    [code="java"]
    public static void main(String args[]) {
    JFrame frame = new JFrame();
    frame.setBounds(100, 100, 500, 375);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTable table = new JTable();
        final UserTableModel userTableModel = new UserTableModel();
        userTableModel.setUsers(Arrays.asList(new User("1", "fuxueliang")));
        table.setModel(userTableModel);
    
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add("Center", table);
    
        JButton button = new JButton("Change Model");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String current = String.valueOf(System.currentTimeMillis());
                // 注意:这里修改了UserTableModel的list, 这个list可以是你从数据库上查出来的
                userTableModel.setUsers(Arrays.asList(new User("2", current)));
            }
        });
        frame.getContentPane().add("South", button);
        frame.setVisible(true);
    }
    

    [/code]
    总的来说, 也不是很复杂, 具体的可以参看JavaDoc.希望对你有所帮助.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog