简体   繁体   English

“上一个”按钮不在阵列中循环,“下一个”按钮可以正常工作

[英]“Prev” button not cycling through array, “Next” button works fine

I am trying to get "Next" and "Previous" buttons working in my program. 我试图在程序中使用“下一步”和“上一步”按钮。 The next button works as expected, but I can't get the logic right for the previous button. 下一个按钮按预期工作,但我无法正确理解上一个按钮的逻辑。 I am getting the error: 我收到错误消息:

"Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 at Bookstore8$3.actionPerformed(Bookstore8.java:257)" “线程“ AWT-EventQueue-0”中的异常java.lang.ArrayIndexOutOfBoundsException:在Bookstore8 $ 3.actionPerformed(Bookstore8.java:257)处为-1”

This is my Bookstore class, maybe someone can give me some advice on how to get the logic right for the "Previous" button? 这是我的书店课程,也许有人可以给我一些有关如何正确使用“上一个”按钮的逻辑的建议? The other three buttons work fine. 其他三个按钮可以正常工作。 I just can't get that last button figured-out. 我只是想不通最后一个按钮。

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

     }

}

You're checking the wrong boundary, the top boundary, in your prev's ActionListener as noted in comments below: 您正在检查上一个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);
  }

Instead, since your decrementing the index, you need to check if it is below the bottom boundary, to check if it's < 0. For example: 相反,因为你的递减索引,你需要检查它是否是底部界限以下 ,以检查它是否<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);
  }

Or another way that can work with either prev or next: 或者可以与上一个或下一个一起使用的另一种方式:

  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);
  }

As an aside, your code is grossly over-using the static modifier, and is putting too much code and responsibility in the main method. 顺便说一句,您的代码严重过度使用了static修饰符,并且在main方法中放置了过多的代码和责任。 I strongly urge you to OOP-ify your code quite a bit, make it more OOP compliant and well behaved. 我强烈敦促您对代码进行OOP修改,使其更符合OOP并表现良好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java swing 使分页 Next/Prev, Next button Forword Record or Prev goback on button press - java swing make Pagination Next/Prev , Next button Forword Record or Prev goback on button press 使用按钮单击循环浏览 Jlabel 的图像时出现 for 循环问题 - for loop issue when cycling through images for Jlabel with button click 遍历数组 - Cycling through an array 禁用的按钮在狐狸中工作正常,但在IE中不起作用 - Disabled button works fine in fire fox, but not in IE (JAVA战舰)按钮/图像网格工作正常,但是当我在其旁边添加第二个网格时,它们都被弄乱了 - (JAVA battleships) button/image grid works fine but when I add a second grid next to it they both get messed up 当用户单击下一步和上一页按钮时,Android如何在Fragment中保存所有视图 - Android how to save all views in Fragment when user click on next and prev button GWT CELLTABLE SimplePager:在SimplePager中出现的first,last,next,prev按钮上的事件处理? - GWT CELLTABLE SimplePager : Event handling on first,last,next,prev button present in SimplePager? 为什么我的程序不循环遍历数组 - Why is my program not cycling through the array Click()在按钮上不起作用,但是getText()在Selenium Webdriver中与相同的xpath一起正常工作 - Click() not working on a button but getText() works fine with same xpath in selenium webdriver 按钮触发的repaint()在调用函数直接工作时不起作用 - Button triggered repaint() not working while call the function directly works fine
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM