java - "Prev"按钮未循环遍历数组,"Next"按钮工作正常

标签 java

我正在尝试让“下一个”和“上一个”按钮在我的程序中工作。下一个按钮按预期工作,但我无法获得上一个按钮的正确逻辑。我收到错误:

“线程“AWT-EventQueue-0”中出现异常 java.lang.ArrayIndexOutOfBoundsException:-1 在 Bookstore8$3.actionPerformed(Bookstore8.java:257)"

这是我的书店类(class),也许有人可以给我一些关于如何使“上一页”按钮的逻辑正确的建议?其他三个按钮工作正常。我只是无法弄清楚最后一个按钮。

/* Declare Bookstore Class */
public class Bookstore8 extends JFrame
{
  /* Declare Index and Assign to First Part of the Array */
 private static int bookstoreIndex = 0;

 private static Book[] bookInventory = new Book[5]; 

     public static JTextArea prepareDisplay(Book myBook, JTextArea myTextArea){

     myTextArea.setText("");

     myTextArea.append(myBook.toString());

     return myTextArea;
    }

     /* Method to Sort Books */
  public static Book [] sortArray(Book[] books) {

   String[] titles = new String[books.length];

   Book[] sortedBooks = new Book [books.length];

   for (int i = 0; i < books.length; i++){
    titles[i] = books[i].getBookTitle();
   }

   Arrays.sort(titles, String.CASE_INSENSITIVE_ORDER);

   for (int i = 0; i < books.length; i++){
        for (int j = 0; j < titles.length; j++){
             if (books[i].getBookTitle().equalsIgnoreCase(titles[j])) {
                        sortedBooks[j] = books[i];
                        break;
             }
        }
   }

   return sortedBooks;
  }

  /* Method to Calculate Inventory */
  public static double calculateInventoryTotal(Book[] books){
   double total = 0;

   for (int i = 0; i < books.length; i++) {

    total += books[i].getBookPrice();
   }
   return total;
  }


   /* Main Method */
  public static void main (String[] args){

       /* Create Book Objects */
       Book one = new Book ("TD45454545", "My First Java Stuff", "Dan Zaleski", 2014, "UPX", 19.99);
       Book two = new Book ("KY67676767", "Hello From Boston", "Joe Smith", 1999, "Random House", 19.99);
       Book three = new Book ("NCC7890987", "I Hate Onions", "John Cooper", 1990, "Random House", 9.99);
       Book four = new Ebook ("YY00000000", "Yo Dawg", "Jim Fix", 1980, "Penguin", 29.99, "http://amazon.com", 2.99);
       Book five = new Ebook ("HB12345678", "Lottsa Books", "Wille Sargent", 2010, "Wherever", 129.99, "http://amazon.com", 12.99);

       bookInventory[0] = two;
       bookInventory[1] = three;
       bookInventory[2] = five;
       bookInventory[3] = one;
       bookInventory[4] = four;

    /* Declare Number Format */ 
  NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);

     /* Sort Items
   bookInventory = sortArray(bookInventory);*/

     /* Declare JText Class */
    final JTextArea textArea = new JTextArea(10,20);
    textArea.setText("");
    textArea.setEditable(false);


    /* Making Buttons */
    JPanel  buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridLayout(1, 3));

    JButton firstButton = new JButton("First");
    buttonPanel.add(firstButton);
    firstButton.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
        bookstoreIndex = 0;
        prepareDisplay(bookInventory[bookstoreIndex], textArea);
       }
  });

    JButton lastButton = new JButton("Last");
    buttonPanel.add(lastButton);
    lastButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
            bookstoreIndex = (bookInventory.length - 1);
            prepareDisplay(bookInventory[bookstoreIndex], textArea);
           }
  });

    JButton prevButton = new JButton("Previous");
    buttonPanel.add(prevButton);
    prevButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        bookstoreIndex--;
        if (bookstoreIndex == bookInventory.length - 1) {
            bookstoreIndex=0;
        }
        prepareDisplay(bookInventory[bookstoreIndex], textArea);
      }
    });

    JButton nextButton = new JButton("Next");
    buttonPanel.add(nextButton);
    nextButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        bookstoreIndex++;
        if (bookstoreIndex == bookInventory.length) {
            bookstoreIndex=0;
        }
        prepareDisplay(bookInventory[bookstoreIndex], textArea);
      }
    });

    /* Total Value */
    String totalValue = "Total Value = " + nf.format(calculateInventoryTotal(bookInventory));
    JLabel valuePanel = new JLabel(totalValue);

  /* Add Logo */
    JLabel logoLabel = new JLabel (new ImageIcon("cmdroundlogo600.png"));
    JPanel logoPanel = new JPanel();
    logoPanel.add(logoLabel);

    JPanel centerPanel = new JPanel();
    centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));
    centerPanel.add(prepareDisplay(bookInventory[bookstoreIndex], textArea));

    /* Assemble the GUI */
    JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout());
    frame.add(logoPanel, BorderLayout.NORTH);
    frame.add(buttonPanel, BorderLayout.SOUTH);
    frame.add(centerPanel, BorderLayout.CENTER);
    frame.add(valuePanel, BorderLayout.LINE_END);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

     }

}

最佳答案

您在前一个 ActionListener 中检查了错误的边界(顶部边界),如下面的评论所述:

  public void actionPerformed(ActionEvent e) {
    bookstoreIndex--;

    // this checks if the index is **ABOVE** the range of acceptable
    if (bookstoreIndex == bookInventory.length - 1) {
        bookstoreIndex=0;
    }
    prepareDisplay(bookInventory[bookstoreIndex], textArea);
  }

相反,由于您递减索引,您需要检查它是否低于底部边界,以检查它是否< 0。例如:

  public void actionPerformed(ActionEvent e) {
    bookstoreIndex--;

    // You want to check if the index is **BELOW** the range of acceptable
    if (bookstoreIndex < 0) {
        bookstoreIndex = bookInventory.length - 1;
    }
    prepareDisplay(bookInventory[bookstoreIndex], textArea);
  }

或者另一种可以与上一个或下一个一起使用的方式:

  public void actionPerformed(ActionEvent e) {
    bookstoreIndex--; // ++ for the next button's listener

    bookstoreIndex += bookInventory.length; // in case it's < 0
    bokstoreIndex %= bookInventory.length; // put it in correct range

    prepareDisplay(bookInventory[bookstoreIndex], textArea);
  }
<小时/>

顺便说一句,您的代码严重过度使用了 static 修饰符,并且在 main 方法中放置了太多代码和责任。我强烈建议您对代码进行 OOP 化,使其更加符合 OOP 且表现良好。

关于java - "Prev"按钮未循环遍历数组,"Next"按钮工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26088381/

相关文章:

java - Java使用的内存多于堆大小(或正确大小的Docker内存限制)

java - 如何在嵌套集合中添加内部映射?

java - 在Java中重命名XML的根节点(带有命名空间前缀)

java - 字符串加号运算符的线程安全,包括优化

java - 如何使用 jdbc 和 JUNIT 创建数据库死锁

java - 循环线程

java - 我应该如何克隆嵌套 ArrayList?

java - 避免在 Spring 中创建 session

java - 在 Flex 和 Java 中实现 zLib 压缩

java - Neo4j Spring ogm 导致关注者-关注者概念的 stackoverflow