【问题标题】:DefaultListModel in Java modifies a String passed as an argument to addElement methodJava 中的 DefaultListModel 修改作为参数传递给 addElement 方法的字符串
【发布时间】:2015-03-24 19:29:13
【问题描述】:

我在尝试使用 DefaultListModel 将从数据库加载的 POJO 输出到 JList 时遇到了一个有趣的问题。 简而言之,这是我的代码:

        // load POJO objects from the DB
        PersonData[] allUsers = loadAllUserData();

        DefaultListModel listModel = new DefaultListModel();

        // fill in (with) the data
        for (int i = 0; i < allUsers.length; i++) {
            listModel.addElement(formPersonDataStringRepresentation(allUsers[i]));
        }

        JList list = new JList(listModel);
        usersList = new JScrollPane(list);

采用 PersonData 对象并生成 String 的方法如下所示:

private String formPersonDataStringRepresentation(PersonData personData) {

        // ... checking the argument ...

        // ... formatting ...
        return String.format("%-17s%-17s", personData.getUsername(),
                personData.getForename()
                );
    }

发生的情况是,尽管使用了相同的格式 "%-17s%-17s",但打印到控制台与用作 DefaultListModel 中的参数时,我的输出看起来不同。

我附上控制台和 Swing 输出的屏幕截图以便更好地理解。

在这种情况下我必须避免使用 DefaultListModel 吗?

【问题讨论】:

  • 在我看来它的格式是一样的——但你意识到控制台是等宽字体,而 Swing 中的默认(Arial?)不是,对吧?
  • 你是对的,明确设置JList的字体 list.setFont(new Font("Monospaced", Font.PLAIN, 12));改变了输出的外观。我应该检查生成的空格,我的错。
  • 非常好 -- 我转发了这篇文章,作为未来 Google 员工的答案。
  • 谢谢,这正是我所期待的。再次感谢

标签: java string-formatting jlist defaultlistmodel


【解决方案1】:

不是空格,而是字体——控制台是等宽的,Swing 默认使用其他东西(Arial?)。

在问题 cmets 中发现,您可以简单地将默认 Swing 字体更改为等宽字体:

list.setFont(new Font("Monospaced", Font.PLAIN, 12));

让它更接近控制台格式。

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 2012-07-26
    • 2018-06-26
    • 1970-01-01
    • 2013-01-28
    • 2014-03-03
    • 2016-10-09
    • 2014-08-20
    相关资源
    最近更新 更多