Java 变量未在if语句外部更新
有人能给我解释一下,为什么变量“bookAvailable1”和“bookAvailable2”在点击“借阅簿”或“归还簿”按钮后不更新。我需要建立一个虚拟图书馆,我不会在用户借书或还书后更新库存。我该怎么办?先谢谢你。 这是我的密码: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;
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);
}