私はカウントダウンタイマーを設計しており、ここで見つけました。これはうまく機能します...秒数を入力すると、自動的にカウントダウンされます。ラジオボタンの選択をリッスンして開始時間を設定するようにコードを変更します。「開始」ボタンをクリックすると、カウントダウンが開始されます。レイアウトはうまくいきましたが、以下のコードに ButtonListener を配置するのに問題があります。
私は入れ子になったクラスを使い始めたばかりなので、いくつかの概念は私にはちょっとあいまいです。以下は、私が正しく理解していれば、ボタンのクリックをキャプチャするクラスクActionEvent
の内側にあるカウントダウンです。ActionListener
カウントダウンは、ボタンのクリックに依存しており、独立して実行することはできません。Listener
また、クラスで使用できるクラス内のすべての変数も使用できますEvent
。
したがって、ラジオ ボタンにListener
とを追加したい場合、これらはをカプセル化し、以下のコードをカプセル化すると考えています。クラス宣言はどこに行くべきかをマークしましたが、閉じ括弧はマークしませんでした。それらがどのように機能しているかを理解するために、より詳細な分析を行う必要があります。それは物事を行う正しい方法ですか?それとももっと良い方法がありますか?radiobuttion で startTime 変数を public として宣言すると、他のネストされたクラスに続くはずですよね?Event
Listener
Action
event
このすべてを正しく理解していますか?または、いくつかの重要な点が欠けていますか。これは内部クラスを使用した最初のプロジェクトなので、お手柔らかにお願いします。:)
public Test() {
super("Countdown timer");
final String startTime = "10"
text = new JTextField(startTime, 18);
start = new JButton("Start");
pr = new JRadioButton("30");
sr = new JRadioButton("15");
lr = new JRadioButton("5");
JPanel radioPanel = new JPanel(new GridLayout(0, 1));
radioPanel.add(pr);
radioPanel.add(sr);
radioPanel.add(lr);
//new button action listener here {
// new button action event here {
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent click) {
final long current = System.currentTimeMillis();
try {
final long limit = Integer.parseInt(text.getText().trim())* 1000; // X seconds
timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent event) {
long time = System.currentTimeMillis();
long passed = time - current;
long remaining = limit - passed;
if(remaining <= 0) {
text.setText(startTime);
timer.stop();
} else {
long seconds = remaining/1000;
long minutes = seconds/60;
long hours = minutes/60;
text.setText(String.format("%02d:%02d:%02d remaining", hours, minutes, seconds%60));
}
}
});
timer.start();
} catch(NumberFormatException nfe) {
// debug/report here
nfe.printStackTrace();
}
}});
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(radioPanel);
panel.add(text);
panel.add(start, BorderLayout.CENTER );
add(panel);
}