2

問題は:私はスイングアプリを持っています。2つのbtns( "Start"、 "Stop")を持つ1つのフォームのみ。これらのbtnsに、スレッドクラスを内部に持つActionListenerを追加しました。

btnの[開始]をクリックすると新しいスレッドで作業を開始し、btnの[停止]をクリックするとその作業を終了したいと思います。これに少し似たコードはコンソールでは問題なく機能しますが、スイングでは機能しません。助けていただければ幸いです。前もって感謝します。)。

    class Action implements ActionListener{
        class MyThread extends Thread{
             boolean live = true;

             @Override
             public void run() {            
                while(live)
                     System.out.println("doing...");
             }              

              public void shutDown(){   
                 live = false;
             }
        }
        @Override
        public void actionPerformed(ActionEvent e) {
             JButton source = (JButton) e.getSource();
             MyThread t = new MyThread();
             switch (source.getText()) {
             case "Start":
                  t.start();
                  break;
             case "Stop":
                  t.shutDown();
                  break;
    }

そして、その単純な形

    public class App extends JFrame {
        public static void main(String[] args) {
            App app = new App();
            app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            app.setVisible(true);

            JButton btn1 = new JButton("Start");
            JButton btn2 = new JButton("Stop");

            app.getContentPane().add(btn1, BorderLayout.WEST);
            app.getContentPane().add(btn2, BorderLayout.EAST);

            Action action = new Action();

            btn1.addActionListener(action);
            btn2.addActionListener(action);
        }

    }
4

1 に答える 1

2

ボタンがクリックされるたびに新しいThreadオブジェクトを作成しているため、停止するスレッドは開始したスレッドとは異なります。後で再び停止できるように、開始時に作成したスレッドへの参照を保持する必要があります。

于 2013-03-17T18:20:42.277 に答える