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 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的