JAVA GUI标签输出错误

时间:2018-05-09 11:53:04

标签: java user-interface

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个”之类的东西,并且只是为了减少数量。它仅适用于数字,但是当我添加文本时,我收到了大量错误。任何解决方法或我只需要使用单独的标签?

2 个答案:

答案 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获取值。