我目前遇到两个问题,我过去3个小时都试图解决这个问题。
我无法让input--;
减少if input is not == to 0
我无法让JTextField input
更新程序运行后分配给它的值。运行程序中的错误类型22单击开始,它将转到" test99"。图片是我如何输入值66的示例然后我按下启动并且test99出现而不是test66
我希望我能够在一定程度上解释我的问题,你将能够理解。我已经阅读了很多关于动作听众的文档,但目前这个想法不会为我点击。任何建设性的批评都是受欢迎的。
我也尽可能地简化了我的问题。
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();
}
});
}
}
答案 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)
我对你的代码有一些批评:
int input = (int) (Double.parseDouble(Input.getText()));
为什么要使用Double.parseDouble
,然后在使用int
时投放到Integer.parseInt()
?JTextField
的文本设置为99,然后解析该值一次,然后在计时器中使用它。您从不更新此值,因此它始终 99.您应该在每次用户按下"时解析输入JTextField
中的文本。开始"并更新计时器使用的int
值。请参阅下面的更正解决方案:
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);
}
}