1

を実装するクラスがありますActionlistener。このクラスのボタンをクリックすると、以前に指定した正確な時間に、または他の場所で何かを実行したいと思います。だから私はこれらのクラスを作りました:

class DoSomething implements ActionListener{
     public void actionPerformed(ActionEvent a){
     while(true){
         String test = obtainTime.time;

    if(test.matches("(.*)17:29:30(.*)")){
         Class.doSomethingMethod();
    }
        //Rest of the code
     }
     }
}

class ObtainTime{
     static DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
     static Calendar cal = Calendar.getInstance();
     static String time = dateFormat.format(cal.getTime());
}

問題は、クリックしてからの時間しか取得できないことです。2つ目は、ボタンがまだ実行されているためにボタンがクリックできなくなることです。コードがバックグラウンドで実行されている間にボタンを再度クリックできるようにする方法はありますか?助けてくれてありがとう。

4

4 に答える 4

1

何かをすばやく実行したり、目標時間に達したときにUIを更新する必要がある場合は、JavaSwingTimerを使用します。これに関するその他のドキュメントはここにあります:OracleのSwingTimerチュートリアル。長時間実行されるタスクを実行している場合は、andersojの提案に従い、スケジュールされたエグゼキュータを使用することをお勧めします。

于 2013-03-14T18:02:14.117 に答える
0

いくつかのことを並行して行いたい場合は、スレッドを使用する必要があります。これを行うには、スレッドを使用してクラスを拡張するか、 Runnableインターフェイスを実装します。 両方の方法の優れたチュートリアルがここにあります。

パターンに一致するギ酸塩の時刻と日付を取得するには、このドキュメントを確認してください。Javaで日付と時刻を取得するためのパターンを見つけることができます。

于 2013-03-14T17:36:51.347 に答える
0

あなたの最初の質問:それは紛らわしいですが、あなたはなぜあなたが最初にボタンを押したときによって測定された時間しか得られないのかと尋ねていると思います。答えは、ボタンを初めて押すときにObtainTimeクラスをロードするためです。そのクラスをロードすると、静的初期化子が1回だけ実行されます。この線:

static String time = dateFormat.format(cal.getTime());

静的初期化子です。あなたがおそらくやろうとしていることは、もっと次のようなものです。

class DoSomething implements ActionListener{

  private final ScheduledExecutor scheduler = executors.newSingleThreadScheduledExecutor();
  private final long timeToRunAction;

   DoSomething(long timeToRunAction) {
     this.timeToRunAction = timeToRunAction;
   }

   public void actionPerformed(ActionEvent a)
   {
     long currentTime = System.currentTimeMillis();
     long delayTime = timeToRunAction - currentTime;
     scheduler.schedule(new Runnable() {
         public void run() { Class.doSomethingMethod(); }
     }, delayTime, TimeUnit.MILLISECONDS);
   }
}

このクラスを使用する場合は、インスタンス化するときに、コンストラクターでターゲット時間を指定します。これをより動的にしたいと思うかもしれません。それは問題ありません。timeToRunActionフィールドを変更可能にして、それを設定する方法を提供するだけです。ここでの時間は、UNIXエポックからのミリ秒単位で指定されます。あなたがあなたの目標時間を理解するためにいくつかのカレンダーの魔法をする必要があるならば、私はそれを省きました。

2番目の質問:独自の並行性をロールする代わりに、これを使用ScheduledExecutor.schedule()することを強くお勧めします。アクティビティをスケジュールするには、カレンダーを使用して正しい遅延時間を計算する必要があります。おそらくミリ秒単位です。

于 2013-03-14T17:51:24.177 に答える
0

GUIAPIとしてSwingを使用しているようです。探しているものを実現するには、 javax.swing.SwingWorkerを使用する必要があります。それは次のように行うことができます:

import javax.swing.*;
import java.util.*;
import java.text.*;
import java.awt.*;

public class SWorker extends JFrame
{
    JLabel label ;
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    static SwingWorker worker;
    public void createAndShowGUI()
    {
        setTitle("SwingWorker Demo");
        label = new JLabel();
        getContentPane().add(label,BorderLayout.NORTH);
        setSize(300,200);
        worker = new SwingWorker<String, String>() 
        {
            @Override
            public String doInBackground() 
            {
               cal = Calendar.getInstance();
               String test = dateFormat.format(cal.getTime());
               while (!(test.matches("(.*)23:41:30(.*)")) && ! isCancelled())
               {
                   publish(new String[] {test});
                    Thread.sleep(5);//Added to sleep the thread for 5 ms so that load could be shed from processor..
                   cal = Calendar.getInstance();
                   test = dateFormat.format(cal.getTime());
               }
               return test;
            }

            @Override
            public void done() //This method is called when doInBackground() finishes. i.e when pattern is matched
            {
                try
                {
                    //Call here the method that you want to call after the time matches.
                    label.setText(get() + " Time's up ...!!");  
                }
                catch (Exception ex){}

            }
            @Override
            public void process(java.util.List<String> chunks)
            {
                label.setText(chunks.get(chunks.size()-1));
            }
        };
        String time = dateFormat.format(cal.getTime());
        label.setText(time);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public void start()
    {
        worker.execute();
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                SWorker sWorker = new SWorker();
                sWorker.createAndShowGUI();
                sWorker.start();
            }
        });
    }
}

使用方法の詳細については、SwingWorkerSwingWorkerのこの公式チュートリアルをご覧ください。

于 2013-03-14T18:11:57.047 に答える