迭代列表,但它只显示最后一项

时间:2017-08-14 13:35:50

标签: java swing loops iterator

我想要实现的目标是JLabel显示List中的多个项目。

我已经将列表定义如下,但是当我测试代码时,我的方法迭代列表,点击一下按钮后,只显示列表中的最后一项 {{1} }。

我想在每个按钮点击一个"DONE!"后完成在列表中显示仅下一个项目

JLabel

2 个答案:

答案 0 :(得分:1)

您当前的代码总是覆盖JPanel中的当前文本,并且它执行速度非常快,您没有看到它。不是使用Iterator,而是通过定义每次按下增加的int变量来获取列表中的下一个项目。
在此示例中,index变量是一个公共int:

 jLabel1.setText(strings.get(index));
 if (index < strings.size()-1) 
        index++;

没有循环,这是您方法中所需的一切。

答案 1 :(得分:0)

为了从集合中找到下一个字符串,您需要知道当前项目。

一种方法是将索引(或迭代器)存储在字段中:

List<String> strings=<...>
// 1. store index    
int sentenceIndex = 0; 
// 2. store iterator. You could get ConcurrentModificationException if change list and then use iterator.
Iterator<String> iterator = strings.getIterator();
private void buttonpressActionPerformed() { 
// 1. use index. 
if (sentenceIndex < strings.size()-1) { // avoid IndexOutOfBoundException
  String nextSentence = strings.get(sentenceIndex++);
}
// 2. use iterator
if (iterator.hasNext()) {
  String nextSentence = iterator.next();
}

但实际上你不需要存储东西:

// 3. calculate current index
String currentSentence = jLabel1.getText();
int currentIndex = strings.indexOf(currentSentence);
int nextIndex = incrementIndex(currentIndex);
String nextSentence = strings.get(nextIndex );

请注意,我建议使用新方法incrementIndex。在其中你不仅可以添加长度检查,还可以添加从最后一个元素跳到第一个元素或只是随机选择。

每种方法都有pro和contras:

  1. 索引需要边界检查
  2. 迭代器限制列表更新
  3. 索引计算也需要边界检查,label1应该有正确的初始值

    我更喜欢存储索引,但这是您的选择