【问题标题】:JList/ListModel getElements not workingJList/ListModel getElements 不工作
【发布时间】:2012-05-25 06:50:39
【问题描述】:

我在抓取 ListModel 的所有元素时遇到问题,当我尝试将字符串写入文件时,它们会输出如下内容:

[Ljava.lang.String;@79b43f[Ljava.lang.String;@79b43f

那么我做错了什么?这是导致悲伤的代码:

for (int i = 0; i < listModel.getSize(); i++)
        {
            String[] temp = listModel.getElementAt(i).toString().split("-");
            bw.write(temp[0]);
            bw.write(temp[1]);

            System.out.println(temp[0]);
        }

bw 是一个 bufferedWriter,listModel 是我制作的自定义列表模型。您可能会注意到我已经拆分了字符串,这是因为我想从每个列表行中提取两个不同的值,我只是完成了 setText (text + "-" + text) 在我的 customCellRenderer 实现中,以便使我能够使用 "-" 字符作为分隔符来提取两个值

public class CustomCellRenderer extends JLabel
implements ListCellRenderer
{
    JLabel left, right;
}

public CustomCellRenderer() 
{
    setOpaque(true);
}

@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{        
    String leftData = ((String[])value)[0];
    String rightData = ((String[])value)[1];

    // simply will not function how i want it to.. GRR
    leftData = String.format("%-50s", leftData);


    setText(leftData + "-   " + rightData);

    if (isSelected)
    {
        setBackground(list.getSelectionBackground());
        setForeground(list.getSelectionForeground());
        setBackground(list.getSelectionBackground());
        setForeground(list.getSelectionForeground());
    }
    else
    {
        setBackground(list.getBackground());
        setForeground(list.getForeground());
        setBackground(list.getBackground());
        setForeground(list.getForeground());
    }

    return this;
    }
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发布SSCCE。对数据进行硬编码。
  • 看起来你正在写几个String[] 中的toString() - listModel 中的元素是什么?
  • @amaidment ive 添加了上面的 listModel 代码

标签: java swing file-io jlist defaultlistmodel


【解决方案1】:

您发布的不是ListModel,而是ListCellRenderer。但这确实强化了JList 中的每个项目都是String[] 的想法 - 例如您正在将 JList 中的每个值转换为 String[] 以进行渲染。

String leftData = ((String[])value)[0];
String rightData = ((String[])value)[1];

对于ListModel 的填充位置似乎有些混乱。您的帖子/代码表明您认为它被填充在 ListCellRenderer 中 - 事实并非如此。它只是在研究如何显示 ListModel 中已有的值。

因此,可以在“让您感到悲伤的代码”中快速解决:

String[] temp = (String[]) listModel.getElementAt(i);
bw.write(temp[0]);
bw.write(temp[1]);

但是,我不会真正鼓励这样做,因为你会有未经检查的类转换。

相反,我建议您首先考虑一下为什么要用String[] 填充ListModel?例如你是按如下方式构造JList

JList myList = new JList(new String[]{"A","B"}, new String[]{"C","D"});

【讨论】:

  • 我正在使用 GUI 编辑器创建列表,所以不,我现在没有用字符串创建它...但是我只是尝试转换为 (String[]) 并且它有效!我发誓我以前试过,但是,它有效:)
【解决方案2】:

似乎在您的自定义列表模型中, listModel.getElementAt(i) 返回一个数组。如果您需要进一步的帮助,请检查并在此处发布您的自定义列表模型。

【讨论】:

  • 我已将我的自定义列表模型代码添加到原始问题帖子中
  • 它还返回一个字符串,然后我根据“-”字符将其拆分为一个数组,但是值似乎是内存引用而不是原始字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
相关资源
最近更新 更多