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

我想要实现的是有一个JLabel来显示List多个项目。

我已经将列表定义如下,但是当我测试代码时,我的方法迭代遍历列表,单击按钮后,只显示列表中的最后一项 "DONE!"

我试图在每个按钮单击一个JLabel后, 显示列表中的下一个项目

 public class ScoutGUI extends javax.swing.JFrame { /** * Creates new form ScoutGUI */ List strings = Arrays.asList("Do you mind Clutter in Room?", "Do you mind alarm clocks?","Do you mind loud visitors?","Can you sleep with lights on?","Do you mind noise past Midnight?", "Do you consider yourself as an introvert?", "Do you consider yourself as an extrovert?","Do you like to go to parties?","Do you drink alcoholic beverages?(21+)", "DONE!"); ArrayList obj = new ArrayList(); String name , email , gender , major , year , language , building ; int id , i; public ScoutGUI() { initComponents(); } public ScoutGUI(int a) { i = a; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") //  private void initComponents() { panel1 = new java.awt.Panel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton1.setFont(new java.awt.Font("Courier", 0, 13)); // NOI18N jButton1.setText("NO"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setFont(new java.awt.Font("Courier", 0, 13)); // NOI18N jButton2.setText("YES"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jLabel1.setFont(new java.awt.Font("Courier New", 1, 18)); // NOI18N jLabel1.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(204, 255, 153))); javax.swing.GroupLayout panel1Layout = new javax.swing.GroupLayout(panel1); panel1.setLayout(panel1Layout); panel1Layout.setHorizontalGroup( panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panel1Layout.createSequentialGroup() .addGap(71, 71, 71) .addComponent(jButton1) .addGap(94, 94, 94) .addComponent(jButton2) .addContainerGap(129, Short.MAX_VALUE)) .addGroup(panel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); panel1Layout.setVerticalGroup( panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panel1Layout.createSequentialGroup() .addGap(26, 26, 26) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 159, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton1) .addComponent(jButton2)) .addContainerGap(68, Short.MAX_VALUE)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(panel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(panel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); pack(); }//  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: //skip and never buttonpressActionPerformed(); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: //match and update buttonpressActionPerformed(); } private void buttonpressActionPerformed() { // int i = 0; Iterator iterator = strings.iterator(); //for (String strin : strings) while (iterator.hasNext()) { //if (jButton2.isSelected() || jButton1.isSelected()) //{ jLabel1.setText(iterator.next()); //} } } /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(ScoutGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(ScoutGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(ScoutGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(ScoutGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ScoutGUI().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private java.awt.Panel panel1; // End of variables declaration } 

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

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

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

为了从集合中找到下一个字符串,您需要以某种方式了解当前项目。

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

 List strings=<...> // 1. store index int sentenceIndex = 0; // 2. store iterator. You could get ConcurrentModificationException if change list and then use iterator. Iterator 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. index calcucaliton还需要边界检查,而label1应该具有正确的初始值

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