1

t.isStopped()オーバーライドされたメソッドにアクセスしたいのですrun()が、次のエラーが発生します。

別のメソッドで定義された内部クラス内で非最終変数 t を参照することはできません

t を最終変数に設定すると

ローカル変数 t が初期化されていない可能性があります

<!-- language: java -->

jHibernateCheckBox = new JCheckBox("Sleep / Hibernate after ");
jHibernateTextField = new JTextField("240");

jHibernateCheckBox.addActionListener(new ActionListener() {

  @Override
  public void actionPerformed(ActionEvent e) {


     StoppableThread t = new StoppableThread() {

        @Override
        public void run() {
           t.setIsRunning(true);
           long timestamp = new Date().getTime();
           int minutes = Integer.parseInt(jHibernateTextField.getText());
           long secounds = minutes * 60;
           long millisecounds = secounds * 1000;
           long elapsedTime = new Date().getTime();

           do {
              try {
                 Thread.sleep(1000);
                 millisecounds -= new Date().getTime() - elapsedTime;
                 secounds = millisecounds / 1000;
                 if(secounds < 60) {
                    jHibernateTextField.setText("" + secounds);
                    jRemainingLabel.setText(" secounds remaining");
                 }
                 else {
                    jHibernateTextField.setText("" + secounds / 60);
                    jRemainingLabel.setText(" minutes remaining");
                 }
              } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
              }
              elapsedTime = new Date().getTime();
           }while(!t.isStopped() && timestamp + minutes * 60 * 1000 > new Date().getTime());

           jHibernateTextField.setText("" + minutes);

           if(t.isStopped()) return;
           else {
              console.out("Computer wird schlafen gelegt =)");
              //Hibernate (siehe LAPTOP)
           }

        }
     };

     Thread thread = new Thread(t);


     if(jHibernateCheckBox.isSelected()) {
        jHibernateTextField.setEnabled(false);
        thread.start();
     }
     else {
        jHibernateTextField.setEnabled(true);
        t.setIsStopped(true);
     }
  }

});

内部クラスで変数 t にアクセスすることは可能ですか、またはチェックボックスが再度クリックされた場合にスレッドを停止する方法を知っている人はいますか?

jHibernateCheckBox をもう一度クリックしたときにタイマーの動作を停止したいだけです...別の方法がありますか?

4

4 に答える 4

2

質問とは関係ありませんが、投稿したコード スニペットでは、Swing スレッド ルールに違反しています。すべての Swing コンポーネントは、イベント ディスパッチ スレッドからのみアクセス/変更する必要があります。から Swing コンポーネントを変更するStoppableThreadことは許可されておらず、実行時に奇妙な動作が発生する可能性があります。

コードをざっと見てみると、 aを使用してSwingWorker進行状況イベントを発生させることができるようです。JProgressBarチュートリアルで説明されているのとほぼ同じメカニズム( を使用する部分SwingWorker)

詳細については、Swing 同時実行チュートリアルを参照してください。

于 2012-11-19T17:36:02.443 に答える
1

実装内で「this」キーワードを使用してみてください。

于 2012-11-19T17:05:18.847 に答える
1
                  StoppableThread t = new StoppableThread() {

                    @Override
                    public void run() {
                        t.setIsRunning(true);
                        long timestamp = new Date().getTime();
                        int minutes = Integer.parseInt(jHibernateTextField.getText());
                        long secounds = minutes * 60;
                        long millisecounds = secounds * 1000;
                        long elapsedTime = new Date().getTime();

                        do {
                            try {
                                Thread.sleep(1000);
                                millisecounds -= new Date().getTime() - elapsedTime;
                                secounds = millisecounds / 1000;
                                if(secounds < 60) {
                                    jHibernateTextField.setText("" + secounds);
                                    jRemainingLabel.setText(" secounds remaining");
                                }
                                else {
                                    jHibernateTextField.setText("" + secounds / 60);
                                    jRemainingLabel.setText(" minutes remaining");
                                }
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            elapsedTime = new Date().getTime();
                        }while(!t.isStopped() && timestamp + minutes * 60 * 1000 > new Date().getTime());

                        jHibernateTextField.setText("" + minutes);

                        if(t.isStopped()) return;
                        else {
                            console.out("Computer wird schlafen gelegt =)");
                            //Hibernate (siehe LAPTOP)
                        }

                    }
                };

run メソッド内で t を に置き換えthisます。

于 2012-11-19T17:06:17.233 に答える
-1

I've tried something new, and now it works. I don't know if this is a blundering but
just take a look.

private StoppableThread t;

public void initComponents() {
...
...
t = new StoppableThread() {
        @Override
        public void run() {
            setIsRunning(true);
            long timestamp = new Date().getTime();
            int minutes = Integer.parseInt(jHibernateTextField.getText());
            long secounds = minutes * 60;
            long millisecounds = secounds * 1000;
            long elapsedTime = new Date().getTime();

            do {
                try {
                    Thread.sleep(1000);
                    millisecounds -= new Date().getTime() - elapsedTime;
                    secounds = millisecounds / 1000;
                    if(secounds < 60) {
                        jHibernateTextField.setText("" + secounds);
                        jRemainingLabel.setText(" secounds remaining");
                    }
                    else {
                        jHibernateTextField.setText("" + secounds / 60);
                        jRemainingLabel.setText(" minutes remaining");
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                elapsedTime = new Date().getTime();
            }while(!isStopped() && timestamp + minutes * 60 * 1000 > new Date().getTime());

            jHibernateTextField.setText("" + minutes);

            if(isStopped()) return;
            else {
                console.out("Computer wird schlafen gelegt =)");
                //Hibernate (siehe LAPTOP)
            }

        }
    };

    jHibernateCheckBox.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {


            Thread thread = new Thread(AutoBarbarPanel.this.t);


            if(jHibernateCheckBox.isSelected()) {
                jHibernateTextField.setEnabled(false);
                thread.start();
            }
            else {
                jHibernateTextField.setEnabled(true);
                t.setIsStopped(true);
            }
        }

    });
}

Thanks for all answers

于 2012-11-20T07:42:25.180 に答える