![](/img/trans.png)
[英]java swing make Pagination Next/Prev , Next button Forword Record or Prev goback on button press
[英]“Prev” button not cycling through array, “Next” button works fine
我試圖在程序中使用“下一步”和“上一步”按鈕。 下一個按鈕按預期工作,但我無法正確理解上一個按鈕的邏輯。 我收到錯誤消息:
“線程“ AWT-EventQueue-0”中的異常java.lang.ArrayIndexOutOfBoundsException:在Bookstore8 $ 3.actionPerformed(Bookstore8.java:257)處為-1”
這是我的書店課程,也許有人可以給我一些有關如何正確使用“上一個”按鈕的邏輯的建議? 其他三個按鈕可以正常工作。 我只是想不通最后一個按鈕。
/* 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並表現良好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.