当前位置: 首页 > 面试题库 >

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

颛孙玉石
2023-03-14
问题内容

首先,我要说的不是关于渲染表格单元。

这是我基于User数据库中的对象使用2D数组构建的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)。那么,他们用表行设置Object的任何方法吗?

这是我的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);


 类似资料:
  • 我使用以下代码来设置jTable中的备用背景行颜色: 它是有效的。但是,我想使用自定义颜色(如rgb(242242))代替浅灰色作为替代颜色,但在执行以下操作时: 替代颜色完全被忽略,所有行都有白色背景。看起来此方法仅适用于属于颜色枚举的颜色。怎么会这样? 下面是一个完整的工作示例,随后是结果屏幕:

  • 问题内容: 我想将Python的内置set类与我创建的自定义类一起使用。如果要创建包含自定义类实例的集合,我需要实现哪些功能以便执行测试,例如set_a-set_b? 问题答案: 它将开箱的,但是,可能有情况下,如果是有意义的过载,和。默认情况下,将比较对象的身份。这可能不是您想要的。在这种情况下,您必须注意相等的对象具有相同的哈希值,理想情况下,不相等的对象具有不同的哈希值(尽管这不是必需的,但

  • 我正在使用MPAndroidChart显示一个相对简单的条形图。 有2件事我需要设置,我不知道如何自定义: > 我需要为每个条添加文本,而不是简单的值,每个条本身也有样式。 在每个条的顶部,我需要放置各种类型的可绘制材料来覆盖它的宽度(例如一个条中高度为2dp的蓝色,或另一个条上高度相同的黄色渐变)。 下面是我需要做的一个演示: > 我知道我也可以通过使用添加图标,但这似乎不适用于应该使用整个条形

  • 问题内容: 我最近开始在Node.js中工作,在app.js文件中有以下一行: 现在,如何设置自己的自定义favicon.ico? 问题答案: 在Express 4中 安装收藏夹中间件,然后执行以下操作: 或者更好,使用模块: (请注意,此解决方案也可以在Express 3应用中使用) 在Express 3中 根据API,接受一个location参数: 大多数时候,您可能希望这样做(如vsync建

  • 问题内容: 我正在尝试创建中间件,以有选择地将kwarg传递给满足条件的每个视图。 问题是我找不到如何设置中间件的示例。我已经看到了覆盖我想要的方法的类: 但是我该把课程放在哪里?我是否创建一个中间件应用程序并将其放在其中,然后在其中引用它? 问题答案: 第一:路径结构 如果没有,则需要按照以下结构在应用程序中创建中间件文件夹: 文件夹中间件应与settings.py,URL,模板…放置在同一文件

  • 问题内容: 美好的一天。 如果可以根据需要更改JLabel和JTextField字体大小,是否还可以更改JTable的列名和元素的字体样式(大小,外观,颜色)? 另外,我正在使用Windows的外观。 谢谢, 问题答案: 有默认值,以及和。您可以使用与键来覆盖默认。