1

私はカウントダウンタイマーを設計しており、ここで見つけました。これはうまく機能します...秒数を入力すると、自動的にカウントダウンされます。ラジオボタンの選択をリッスンして開始時間を設定するようにコードを変更します。「開始」ボタンをクリックすると、カウントダウンが開始されます。レイアウトはうまくいきましたが、以下のコードに ButtonListener を配置するのに問題があります。

私のUI

私は入れ子になったクラスを使い始めたばかりなので、いくつかの概念は私にはちょっとあいまいです。以下は、私が正しく理解していれば、ボタンのクリックをキャプチャするクラスクActionEventの内側にあるカウントダウンです。ActionListenerカウントダウンは、ボタンのクリックに依存しており、独立して実行することはできません。Listenerまた、クラスで使用できるクラス内のすべての変数も使用できますEvent

したがって、ラジオ ボタンにListenerとを追加したい場合、これらはをカプセル化し、以下のコードをカプセル化すると考えています。クラス宣言はどこに行くべきかをマークしましたが、閉じ括弧はマークしませんでした。それらがどのように機能しているかを理解するために、より詳細な分析を行う必要があります。それは物事を行う正しい方法ですか?それとももっと良い方法がありますか?radiobuttion で startTime 変数を public として宣言すると、他のネストされたクラスに続くはずですよね?EventListenerActionevent

このすべてを正しく理解していますか?または、いくつかの重要な点が欠けていますか。これは内部クラスを使用した最初のプロジェクトなので、お手柔らかにお願いします。:)

  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);
  }
4

1 に答える 1

1

あなたのコードは、典型的な意味での内部 (= ネストされた) クラスを定義していません。Anonymous (inner) Classesを使用しています。あなたはこのSOの質問に興味があるかもしれません:

Javaで匿名(内部)クラスはどのように使用されますか?

正真正銘の内部 (= ネストされた) クラスの詳細については、Oracle のJava チュートリアルの関連部分を試してください。SO に関する次の質問で説明されている、静的と非静的の 2 種類の内部クラスがあることに注意してください。

Java 内部クラスと static ネストされたクラス

于 2013-04-13T09:04:14.510 に答える