Java 变量未在if语句外部更新

Java 变量未在if语句外部更新,java,swing,Java,Swing,有人能给我解释一下,为什么变量“bookAvailable1”和“bookAvailable2”在点击“借阅簿”或“归还簿”按钮后不更新。我需要建立一个虚拟图书馆,我不会在用户借书或还书后更新库存。我该怎么办?先谢谢你。 这是我的密码: import java.awt.BorderLayout; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

有人能给我解释一下,为什么变量“bookAvailable1”和“bookAvailable2”在点击“借阅簿”或“归还簿”按钮后不更新。我需要建立一个虚拟图书馆,我不会在用户借书或还书后更新库存。我该怎么办?先谢谢你。 这是我的密码:

import java.awt.BorderLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class MyFrame extends JFrame {

    JPanel panelChB, panelText;
    private JLabel title, bookTitle, bookTitle1;
    private JButton borrowBook, returnBook;
    private JCheckBox ch1, ch2;
    int bookAvailable1 = 3;
    int bookAvailable2 = 3;
    boolean haveBook1 = false;
    boolean haveBook2 = false;

    public MyFrame() {

        setSize(400, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setTitle("Books");
        setResizable(false);
        setLayout(new BorderLayout());
        setVisible(true);

        panelChB = new JPanel();
        panelChB.setLayout(new BoxLayout(panelChB, BoxLayout.Y_AXIS));

        ch1 = new JCheckBox();
        ch2 = new JCheckBox();
        borrowBook = new JButton("BorrowBook");
        borrowBook.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (ch1.isSelected() || ch2.isSelected()) {
                    if (ch1.isSelected() && bookAvailable1 != 0) {
                        String infoMessage = "You borrowed \"Walk\"";
                        JOptionPane.showMessageDialog(null, infoMessage,
                                "Message: ", JOptionPane.INFORMATION_MESSAGE);
                        bookAvailable1--;
                        haveBook1 = true;

                    }
                    if (ch2.isSelected() && bookAvailable2 != 0) {
                        String infoMessage = "You borrowed \"Red and Black\"";
                        JOptionPane.showMessageDialog(null, infoMessage,
                                "Message: ", JOptionPane.INFORMATION_MESSAGE);
                        bookAvailable2--;
                        haveBook2 = true;
                    }
                } else {
                    String infoMessage = "No book selected";
                    JOptionPane.showMessageDialog(null, infoMessage,
                            "Message: ", JOptionPane.INFORMATION_MESSAGE);
                }
            }

        });
        returnBook = new JButton("Return");
        returnBook.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                if (ch1.isSelected() || ch2.isSelected()) {
                    if (ch1.isSelected() && haveBook1 == true) {
                        String infoMessage = "Book \"Walk\" returned";
                        JOptionPane.showMessageDialog(null, infoMessage,
                                "Message: ", JOptionPane.INFORMATION_MESSAGE);
                        bookAvailable1++;
                        haveBook1 = false;

                    }
                    if (ch2.isSelected() && haveBook2 == true) {

                        String infoMessage = "Book \"Red and Black\" returned";
                        JOptionPane.showMessageDialog(null, infoMessage,
                                "Message: ", JOptionPane.INFORMATION_MESSAGE);
                        bookAvailable2++;
                        haveBook2 = false;
                    }
                } else {
                    String infoMessage = "No book selected";
                    JOptionPane.showMessageDialog(null, infoMessage,
                            "Message: ", JOptionPane.INFORMATION_MESSAGE);
                }

            }

        });


        //System.out.println(available1);

        panelChB.add(ch1);
        panelChB.add(ch2);
        panelChB.add(borrowBook);
        panelChB.add(returnBook);


        //System.out.println(available1);
        panelText = new JPanel();
        panelText.setLayout(new BoxLayout(panelText, BoxLayout.Y_AXIS));
        bookTitle = new JLabel("Walk - stock  " + bookAvailable1);
        bookTitle1 = new JLabel("Red and Black - stock  " + bookAvailable2);
        panelText.add(bookTitle);
        panelText.add(bookTitle1);

        add(panelChB, BorderLayout.WEST);
        add(panelText, BorderLayout.CENTER);

    }

    public static void main(String[] args) {
        JFrame jf = new MyFrame();
    }
}

haveBook2和haveBook1变量为false,因此它不会进入if部分。在结束时执行设置Visible(true)。

变量会更新,但这不会影响屏幕上的标签。到
bookAvailable1--已执行,标签已初始化,不会再次自动更改

替换此项:

bookTitle = new JLabel("Walk - stock  " + bookAvailable1);
bookTitle1 = new JLabel("Red and Black - stock  " + bookAvailable2);
与:

并添加一个新方法:

private void updateStockDisplay() {
    bookTitle.setText("Walk - stock  " + bookAvailable1);
    bookTitle1.setText("Red and Black - stock  " + bookAvailable2);
}

现在,添加对
updateStockDisplay()的调用位于每个ActionListener的末尾,用于“借用/返回”按钮,以便在变量更改时更新标签。

您是否尝试过调试?问题是您编写完整的长代码,然后查找错误,在开发时您应该测试每个构造。正是这样,您只需要确保更新实际标签上的文本,而不仅仅是变量。文本不会自动更新,因此需要对JLabel对象调用setText方法。
private void updateStockDisplay() {
    bookTitle.setText("Walk - stock  " + bookAvailable1);
    bookTitle1.setText("Red and Black - stock  " + bookAvailable2);
}