Кнопка «Prev» не циклически перебирает массив, кнопка «Next» работает нормально

1

Я пытаюсь получить кнопки "Next" и "Previous", которые работают в моей программе. Следующая кнопка работает так, как ожидалось, но я не могу получить логику для предыдущей кнопки. Я получаю сообщение об ошибке:

"Исключение в потоке" AWT-EventQueue-0 "java.lang.ArrayIndexOutOfBoundsException: -1 в Bookstore8 $ 3.actionPerformed(Bookstore8.java:257)"

Это мой класс Bookstore, может быть, кто-то может дать мне несколько советов о том, как правильно использовать логику для кнопки "Предыдущая"? Остальные три кнопки работают нормально. Я просто не могу понять, что последняя кнопка понята.

/* 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);

     }

}
Теги:

1 ответ

2
Лучший ответ

Вы проверяете неправильную границу, верхнюю границу, в своем предыдущем 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 listener

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

    prepareDisplay(bookInventory[bookstoreIndex], textArea);
  }

В противоположность этому, ваш код сильно перегружает статический модификатор и ставит слишком большой код и ответственность в основном методе. Я настоятельно рекомендую вам OOP-ify ваш код совсем немного, сделать его более совместимым с OOP и хорошо себя вести.

  • 0
    Спасибо, это мне очень помогло. И спасибо за совет по моему коду, я новичок, поэтому я склонен выбрасывать туда много мусора. Ценю помощь!
  • 1
    @DanZaleski: пожалуйста. Вы захотите трактовать свой код «представления», часть кода с графическим интерфейсом как свой собственный OOP-совместимый класс, который использует часть «модели» вашего кода, коллекцию Books, которая также является собственным классом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню