ActionListener和IF语句出现问题

时间:2016-07-05 12:27:52

标签: java actionlistener jtextfield decrement

我目前遇到两个问题,我过去3个小时都试图解决这个问题。

  1. 我无法让input--;减少if input is not == to 0

  2. 我无法让JTextField input更新程序运行后分配给它的值。运行程序中的错误类型22单击开始,它将转到" test99"。enter image description here图片是我如何输入值66的示例然后我按下启动并且test99出现而不是test66

  3. 我希望我能够在一定程度上解释我的问题,你将能够理解。我已经阅读了很多关于动作听众的文档,但目前这个想法不会为我点击。任何建设性的批评都是受欢迎的。

    我也尽可能地简化了我的问题。

    package test;
    
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import java.awt.BorderLayout;
    import javax.swing.SwingConstants;
    import javax.swing.Timer;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JTextField;
    import javax.swing.JButton;
    
    public class test {
    
    private JFrame frame;
    private JButton btnStart;
    
    /**
     * 
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    test window = new test();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the application.
     */
    public test() {
        initialize();
    }
    
    /**
     * Initialize the contents of the frame.
     */
    
    private void initialize() {
        frame = new JFrame();
        JLabel Output = new JLabel("Time left: ");
        Output.setHorizontalAlignment(SwingConstants.CENTER);
        frame.getContentPane().add(Output, BorderLayout.CENTER);
        JTextField Input = new JTextField();
        btnStart = new JButton("start");
    
        Input.setText("99");
        int input = (int) (Double.parseDouble(Input.getText()));
    
        Input.setHorizontalAlignment(SwingConstants.CENTER);
        frame.getContentPane().add(Input, BorderLayout.SOUTH);
        Input.setColumns(10);
        frame.getContentPane().add(btnStart, BorderLayout.NORTH);
        frame.setBounds(100, 100, 300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        Input.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e) {
    
              }
            });
    
    
        Timer t = new Timer(1000, new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                Output.setText("test" + input);
    
                if (input == 0) {
                    ((Timer) e.getSource()).stop();
                }
                input--;
            }
    
        });
    
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t.start();
            }
        });
    
    }
    

    }

2 个答案:

答案 0 :(得分:1)

我建议你的输入变量不在你的函数中,而是在你的类中。否则会遇到范围问题。例如:

public class test {

  private JFrame frame;
  private JButton btnStart;
  private int input;
  private JTextField Input;

  //...

}

应解决问题:)

我不确定第二个问题,但如果你想从输入的值中倒数,你必须更新你的动作监听器:

btnStart.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        input = (int) (Double.parseDouble(Input.getText()));
        t.start();
    }
});

答案 1 :(得分:0)

我对你的代码有一些批评:

  1. 变量名称应以小写字母开头,类名称应以大写字母开头。
  2. int input = (int) (Double.parseDouble(Input.getText()));为什么要使用Double.parseDouble,然后在使用int时投放到Integer.parseInt()
  3. " test99"出现在你的GUI而不是" test66"因为您将输入JTextField的文本设置为99,然后解析该值一次,然后在计时器中使用它。您从不更新此值,因此它始终 99.您应该在每次用户按下"时解析输入JTextField中的文本。开始"并更新计时器使用的int值。
  4. 请参阅下面的更正解决方案:

    import javax.swing.*;
    import java.awt.*;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class Test {
    
        private Test() {
            initialize();
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(Test::new);
        }
    
        private void initialize() {
    
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
    
            JPanel timePanel = new JPanel(new FlowLayout());
    
            timePanel.add(new JLabel("Time left: "));
    
            JLabel timeOutput = new JLabel("");
            timePanel.add(timeOutput);
    
            frame.add(timePanel, BorderLayout.CENTER);
    
            JPanel inputPanel = new JPanel(new FlowLayout());
    
            JButton startButton = new JButton("Start");
    
            JButton stopButton = new JButton("Stop");
            stopButton.setEnabled(false);
    
            JTextField timeField = new JTextField(5);
    
            inputPanel.add(startButton);
            inputPanel.add(stopButton);
            inputPanel.add(timeField);
    
            frame.add(inputPanel, BorderLayout.SOUTH);
    
            Timer timer = new Timer();
    
            startButton.addActionListener(e -> {
    
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
    
                timer.scheduleAtFixedRate(new TimerTask() {
    
                    int time = Integer.parseInt(timeField.getText());
    
                    @Override
                    public void run() {
                        if(time < 0) timer.cancel();
                        timeOutput.setText(String.valueOf(time--));
                    }
                }, 0, 1000);
            });
    
            stopButton.addActionListener(e -> {
                timer.cancel();
                stopButton.setEnabled(false);
                startButton.setEnabled(true);
                timeOutput.setText("");
            });
    
            frame.pack();
            frame.setVisible(true);
        }
    }