java - 如何在 JTable 行中设置自定义对象

标签 java swing user-interface jtable tablemodel

我应该首先说明这一点,这与渲染表格单元格无关。

这是我使用基于数据库中的 User 对象的二维数组构建的 TableModel。

    List<User> userList = userManagerService.getAllUsers();

    /* String[] col_user = {"Username", "Name", "Phone", .... } */
    String[][] data = new String[userList.size()][col_user.length];
    int i = 0;
    for (User user : userList) {
        String[] userdata = new String[col_user.length];
        userdata[0] = user.getUserUsername();
        userdata[1] = user.getUserName();
        userdata[2] = user.getUserPhone();
        userdata[3] = user.getUserNic();
        userdata[4] = user.getUserAddress();
        userdata[5] = user.getUserEmail();

        data[i++] = userdata;
    }

    VstTableItemModel tiModel = new VstTableItemModel(data, col_user);
    dataTable.setModel(tiModel);

我的问题是如何使用表中的选定行取回 User 对象。请注意,我无法创建新的 User 对象并用行数据填充它。我必须获取查询的 User 对象(userList 中的对象)。那么,他们有什么方法可以用表格行设置对象吗?

这是我的 VstTableItemModel 类。

public class VstTableItemModel extends AbstractTableModel {

    ArrayList<Object[]> data;
    String[] header;

    public VstTableItemModel(Object[][] obj, String[] header) {
        this.header = header;
        data = new ArrayList<Object[]>();

        for (int i = 0; i < obj.length; ++i) {
            data.add(obj[i]);
        }
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public int getColumnCount() {
        return header.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return data.get(rowIndex)[columnIndex];
    }

    @Override
    public String getColumnName(int index) {
        return header[index];
    }

}

最佳答案

与其在创建模型之前拆分 User 对象,不如将其直接添加到模型中并让模型为您完成工作...

例如

public class VstTableItemModel extends AbstractTableModel {

    private List<User> users;

    public VstTableItemModel(List<User> users) {

        this.users = new ArrayList<User>(users);

    }

    @Override
    public int getRowCount() {
        return users.size();
    }

    @Override
    public int getColumnCount() {
        return 6;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        Object value = "??";
        User user = users.get(rowIndex);
        switch (columnIndex) {
            case 0:
                value = user.getUserUsername();
                break;
            case 1:
                value = user.getUserName();
                break;
            case 2:
                value = user.getUserPhone();
                break;
            case 3:
                value = user.getUserNic();
                break;
            case 4:
                value = user.getUserAddress();
                break;
            case 5:
                value = user.getUserEmail();
                break;
        }

        return value;

    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return // Return the class that best represents the column...
    }

    /* Override this if you want the values to be editable...
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //....
    }
    */

    /**
     * This will return the user at the specified row...
     * @param row
     * @return 
     */
    public User getUserAt(int row) {
        return users.get(row);
    }

}

通过这种方式,您应该能够执行类似...

List<User> userList = userManagerService.getAllUsers();
VstTableItemModel tiModel = new VstTableItemModel(userList);

现在,当您需要时...您可以抓取代表特定行的用户...

User user = tiModel.getUserAt(rowIndex);

关于java - 如何在 JTable 行中设置自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12559287/

相关文章:

java - 处理 Pokerhand 游戏中重复牌的异常时出错..

java - 如何从 Eclipse/Intellij IDE 运行简单的 Spark 应用程序?

java - 当父窗口关闭时无法读取 Selenium 中的子窗口元素

Java Swing - 在 Java Web Start 中复制/粘贴不起作用

c++ - wxWidgets 3.0 - 新特性和功能、添加和替换已弃用的功能

Java:为不同层组件定义 mouseAdapter 的 jLayeredPane 问题

java - Firestore whereEqualTo、orderBy 和 limit(1) 不起作用

java - 将 JLabel 添加到 MouseListener

java - 使用 HTML 调整 JLabel ImageIcon 的大小

user-interface - 使用字符串在 Red 语言中创建单词和路径