1

これは私の最初の投稿です。

私はネットビーンズにいます。ボタンなどでウィンドウを作りました。

次のような SimpleThread というクラスがあります。

public class SimpleThread extends Thread {

public SimpleThread()
{

}

@Override
public void run()
{

}

また、simplethread (TimerThread、MouseGrabThread) を拡張するさまざまな種類のサブクラス スレッドがあります。

public class MouseGrabThread extends SimpleThread{

private Point pt;
private JTextField x, y;

public MouseGrabThread(JTextField x, JTextField y)
{
    super();
    this.x = x; 
    this.y = y;
}

@Override
public void run()
{
    while(this.isAlive())
    {
        int[] xyVal = new int[2];
        xyVal = getCoords();
        x.setText("" + xyVal[0]);
        y.setText("" + xyVal[1]);
    }
}

public int[] getCoords()
{
    Point pt = MouseInfo.getPointerInfo().getLocation();

    int[] retArr = new int[2];
    retArr[0] = (int)pt.getX();
    retArr[1] = (int)pt.getY();

    return retArr;

}



public class TimerThread extends SimpleThread {

private JTextArea label;
private int time;

public TimerThread(JTextArea label, int time)
{
    super();
    this.label = label;
    this.time = time;
}

@Override
public void run()
{
    int counter = time;
    while(counter != -1)
    {

        label.setText("You have: " + counter + " seconds until the timer ends!\n");
        counter--;
        try {
            this.sleep(1000);
        } catch (InterruptedException ex) {
            System.out.println("Thread Interrupted");
        }

    }
    stop();
}

私の UI ウィンドウ クラスには、次のようなものがあります。

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
   SimpleThread timer = new TimerThread(jTextArea1, 10); //This counts down from 10 seconds and updates a status text box each second
   SimpleThread mouseGrab = new MouseGrabThread(jTextField1, jTextField2); //This grabs mouse coords and updates two boxes in the UI.
   timer.start();
   if(timer.isAlive())
   {
      mouseGrab.start();
   }
   while(timer.isAlive())//######
   {
       if(!mouseGrab.isAlive())
       {
           mouseGrab.start();
       }
   }
}           

ボタンを押すと、プログラムが 10 秒間フリーズします。

私がマークした行 (//#####) は、メイン スレッドで実行されているため、タイマーの期間中 UI がフリーズする原因となっている行だと思います。これを修正する方法がわかりません。

プログラミングの知識が不足していることをお許しください。大学でデータ構造に関する非常に簡単なコースを受講しているときに、自分でスレッドを作成しているところです。可能であれば、答えをできるだけ「ばかにする」ことができますか?

また、私はこれを行うのがひどいことを知っていますが、良くない場合でも stop() 関数を呼び出します (私を撃たないでください。他に方法がわかりません!)これは私にとってそれをうまく行う方法についてです、素晴らしいです!

4

1 に答える 1

1

あなたが望むかもしれないmouseGrabのは、カウントダウンの終わりに終了することです:

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
   SimpleThread timer = new TimerThread(jTextArea1, 10); //This counts down from 10 seconds and updates a status text box each second
   SimpleThread mouseGrab = new MouseGrabThread(jTextField1, jTextField2); //This grabs mouse coords and updates two boxes in the UI.

   mouseGrab.start();
   timer.start();

   // Wait until countdown finishes
   while(timer.isAlive()) {}

   mouseGrab.stop();
}

貼り付けたコードでは、実行mouseGrabtimerに開始し続けました。タイマーがオンのときにマウス グラブを実行したい場合があります。

編集:確かに、stop()非推奨です。実際にboolean running属性を使用し、そのメソッドTimerThreadのコンテンツをいくつかの方法でラップする必要がありますrun()

while (running) {
    /* stuff */
}

次に、セッターを使用してこのスレッドを外部で「停止」します。正解は、たとえば次のようになります。

   mouseGrab.start();
   timer.start();

   // Wait until countdown finishes
   while(timer.isAlive()) {}

   mouseGrab.setRunning(false);
}

Edit2 :これは最終的にあなたが望むもののようです:

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
   SimpleThread mouseGrab = new MouseGrabThread(jTextField1, jTextField2); //This grabs mouse coords and updates two boxes in the UI.
   SimpleThread timer = new TimerThread(mouseGrab, jTextArea1, 10); //This counts down from 10 seconds and updates a status text box each second

   mouseGrab.start();
   timer.start();
}

と:

public class MouseGrabThread extends SimpleThread {

    private Point pt;
    private JTextField x, y;
    private boolean running;

    public MouseGrabThread(JTextField x, JTextField y) {
        super();
        this.x = x; 
        this.y = y;
    }

    @Override
    public void run() {
        running = true;
        while(running) {
            int[] xyVal = new int[2];
            xyVal = getCoords();
            x.setText("" + xyVal[0]);
            y.setText("" + xyVal[1]);
        }
    }

    public int[] getCoords() {
        Point pt = MouseInfo.getPointerInfo().getLocation();

        int[] retArr = new int[2];
        retArr[0] = (int)pt.getX();
        retArr[1] = (int)pt.getY();

        return retArr;

    }

    public void break() {
        this.running = false;
    }
}


// ------------- //


public class TimerThread extends SimpleThread {

    private MouseGrabThread mouseGrab;
    private JTextArea label;
    private int time;

    public TimerThread(MouseGrabThread mouseGrab, JTextArea label, int time)
    {
        super();
        this.label = label;
        this.time = time;
        this.mouseGrab = mouseGrab;
    }

    @Override
    public void run()
    {
        int counter = time;
        while(counter != -1)
        {
            label.setText("You have: " + counter + " seconds until the timer ends!\n");
            counter--;
            try {
                this.sleep(1000);
            } catch (InterruptedException ex) {
                System.out.println("Thread Interrupted");
            }

        }

        mouseGrab.break();
    }
}
于 2013-04-05T17:36:50.250 に答える