Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

繰り返しの停止について

お世話になってます。

繰り返しの停止をやりたいと思っているのですがうまくいきません。

具体的にはまずフレーム上にJButton"実行″があります。"実行"を押すとある処理(5秒程度)が実行されます。その処理を数秒(15秒程度)ごとに繰り返すためにaddActionListener内でwhile文を用い繰り返しを行っています。
今回はこの繰り返し作業を任意のタイミングで止めたく同フレーム上に"停止"ボタンを作成し、クリックすると繰り返しが終わるという形にしたいと思っています。しかしaddActionListener内でループさせているためループ中は"停止"ボタンが押せない状態になっており繰り返しが停止できません。
何か解決策がありましたら教えていただけないでしょうか?

よろしくお願いします。

11

回答

5578

閲覧

11件の回答

評価

0

実行ボタンを押す
→スレッド起動

停止ボタンを押す
→スレッド停止

でどうカナ?

評価

0

「ループ」ではなく「繰り返し発生するイベント」に置き換えてもいい。
これに限らないけど、他を考慮せずに不定期間ずっとループし続ける構造は危険。

評価

0

ありがとうございます。

まずはスレッドについてやってみてその後、繰り返し発生するイベントについて考えてみたいと思います。

そこでスレッドを調べてみているのですがボタンを押したときのスレッドの起動と停止の書き方がわかりませんでした。
途中まで書いてみたのですがここからどのようにすればいいでしょうか。

//Frame.java

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class Frame extends JFrame implements Runnable{
  Container con = null;
  JPanel panel1;
  JButton     button1, button2;
  Thread thread;
/*
  public void start(){
    thread = new Thread(this);
    thread.start();
  }
  public void stop(){
    Thread tempThread = thread;
    thread = null;
    tempThread.interrupt();
    System.out.println("stop");
  }
  public void run(){
    while(thread != null){
      try{
        System.out.println("run");
      }
      catch(Exception e){
      }
    }
  }
*/    
  public Frame(){
    super("Frame");
    con = this.getContentPane();
    panel1 = new JPanel();
    panel1.setLayout(new GridLayout(1, 2, 1, 1));

    button1 = new JButton("実行");
    button1.setPreferredSize(new Dimension(200, 50));
    button1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        int n=0;
        while(n<10){
          System.out.println("n="+n);
          try{
            Thread.sleep(5000);
          }
          catch(InterruptedException ex){         }
          n++;
        }
      }
    });

    button2 = new JButton("停止");
    button2.setPreferredSize(new Dimension(200, 50));
    button2.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        stop();
      }
    });

    panel1.add(button1);
    panel1.add(button2);
    con.add(panel1);    
    this.setSize(500, 300);
    this.setLocation(10, 10);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);    
  }
}

評価

0

ひとつのクラスで何でもやろうとするのが間違い。
メインのクラスはメインのクラス、スレッドはスレッドでちゃんと役割分担を考えなきゃ。

評価

0

参考にしたサイトがそのようになっていたので1つのクラスでやっていました。mainは記述していないですけど別にしてあります。とりあえず動かすことからやってみようと思いましたので。

上記のプログラムを少しいじったらスレッドの起動はできました。しかし停止がどうしてもできません。
結局ループが最後まで行われてしまいます。

スレッドの停止はどのようにすればいいのでしょうか?

評価

0

スレッド 停止

で検索してみると幸せになれますよ。

評価

0

検索してサンプル等を参考にしているのですが、それでも停止できなくて困っています。
もし、ボタンでスレッドの開始、停止ができるサンプルがありましたらよろしくお願いします。

評価

0

つかさ、その検索の結果自分で何をしてみたかをちゃんと書こうよ。
実は何にもしてないけど、カッコつかないから言ってみてるだけに見えるよ。

評価

0

現在このような形で記述しています。
停止を押すとその回の処理は即座に終わるのですがすぐ次のループに入り、結局最後までループしてしまいます。

//Frame.java

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class Frame extends JFrame implements Runnable{
  Container con = null;
  JPanel panel1;
  JButton     button1, button2;
  Thread thread=null;

  public void start(){
    if(thread==null){
      thread = new Thread(this);
      thread.start();
    }
  }
  public void stop(){
    if(thread != null){
      thread = null;
      thread.interrupt();
    }
  }
  public void run(){
    while(thread != null){
      /*
        ここに処理内容記述
      */
      try{
        sleep(1000);
      }
      catch(InterruptedException e){
      }
    }
  }
   
  public Frame(){
    super("Frame");
    con = this.getContentPane();
    panel1 = new JPanel();
    panel1.setLayout(new GridLayout(1, 2, 1, 1));

    button1 = new JButton("実行");
    button1.setPreferredSize(new Dimension(200, 50));
    button1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        start();
      }
    });

    button2 = new JButton("停止");
    button2.setPreferredSize(new Dimension(200, 50));
    button2.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        stop();
      }
    });

    panel1.add(button1);
    panel1.add(button2);
    con.add(panel1);    
    this.setSize(500, 300);
    this.setLocation(10, 10);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);    
  }
}

評価

0

提案があります。

一回swingをポイして、
Threadだけのサンプルを作りましょ。
多分、混乱しすぎてる。

評価

0

掲示されたソースを
パッと見ただけですが・・・

>      thread = null;
>      thread.interrupt();

これは無理です。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。