import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Stock {
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Stock window = new Stock();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Stock() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JLabel lblBrickStock = new JLabel("10");
lblBrickStock.setBounds(48, 62, 46, 14);
frame.getContentPane().add(lblBrickStock);
JButton btnNewButton = new JButton("Bricks");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int bricks = Integer.parseInt(lblBrickStock.getText());
bricks--;
if (bricks <= 10) {
lblBrickStock.setText(String.valueOf(bricks));
}
}
});
btnNewButton.setBounds(38, 28, 89, 23);
frame.getContentPane().add(btnNewButton);
}
}
我创建了这个股票程序,这是我正在创建的未来程序的原型。该程序的作用是按下按钮时标签中的数字减少。我不能做的是,在标签中我希望它说出“剩余10个”之类的东西,并且只是为了减少数量。它仅适用于数字,但是当我添加文本时,我收到了大量错误。任何解决方法或我只需要使用单独的标签?
答案 0 :(得分:2)
您可以使用实例成员counter
来跟踪数字,而不是从标签文本中获取当前值
public class Stock{
private int counter = 10;
...
}
你的动作听众可能就像:
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
counter--;
if (counter <= 10) {
lblBrickStock.setText(counter + " remaining");
}
}
});
这样,您就不必将lblBrickStock.getText
解析为数值,如果这不再是数值,也不会有获得解析异常的风险。
这是一个小片段,展示了如何在匿名内部类(动作监听器)中使用变量
public class TestFrame extends JFrame{
private int counter = 10;
public TestFrame(){
this.setTitle("Labo - TestFrame");
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.getContentPane().add(new JButton(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(counter--);
}
}));
this.setVisible(true);
this.pack();
}
}
我点击了3次:
10
9
8
答案 1 :(得分:1)
问题在于:
int bricks = Integer.parseInt(lblBrickStock.getText());
您尝试使用String内部解析为Integer值。为避免异常,您可以使用:int bricks = Integer.parseInt(lblBrickStock.getText().replaceAll("\\D+",""));
但更好的想法是静态计数器(如评论中提到的@AxelH)而不是从JLabel获取值。