0

GUIで同期操作を呼び出すためにjavax.swing.timerを実装しています。ただし、その操作は完了するまでに時間がかかるため、そのタイマー呼び出しに中止オプションを提供したいと思います。それは可能ですか?

どうも!

import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Iterator;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JTextField;
import org.omg.CosNaming.IstringHelper;


public class vtm extends JPanel implements ActionListener{

    private JFrame frame;
    private String children[];
    private ConsoleApp hawk[];
    public static String data[][];
    public Timer timer;
    private int count1, count2;
    private int i;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    vtm window = new vtm();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public vtm() {
        timer = new Timer(25000, this);
        //timer.setInitialDelay(190);
        timer.start();
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {

        frame = new JFrame("VTM");
        frame.setSize(1024, 720);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JLabel lblNewLabel_1 = new JLabel("");
        lblNewLabel_1.setIcon(new ImageIcon("config.png"));
        lblNewLabel_1.setBounds(970, 0, 51, 55);
        frame.getContentPane().add(lblNewLabel_1);
        lblNewLabel_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                config x = new config();
                x.main(null);
                timer.stop();
                frame.dispose();
            }
            });

        JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setIcon(new ImageIcon("bg.png"));
        lblNewLabel.setBounds(0, 0, 1024, 720);
        frame.getContentPane().add(lblNewLabel);


        String dir = System.getProperty("user.dir");

        File df = new File(dir);

        FilenameFilter fi = new FilenameFilter(){
            public boolean accept(File df, String name){
                return name.startsWith("D-");
            }
        };

        children = df.list(fi);
        hawk=new ConsoleApp[children.length];

        EventQueue.invokeLater(new Runnable(){
            public void run(){

                int count1 = 0; count2 = 0;

                for(i=0;i<children.length;i++)
                {


                hawk[i]=new ConsoleApp(children[i]);

                Iterator<String> it = hawk[i].p.iterator();

                System.out.println("Hi:"+hawk[i].p.size());

                while(it.hasNext())
                {
                    hawk[i].call(it.next());

                    if(count1 == 3)
                    {
                        count2++;
                        count1=0;
                    }

                    System.out.println("Look: " + hawk[i].l.getText().length());
                    hawk[i].l.setBounds((60 + 270*count1) + ((260-(hawk[i].l.getText().length()*7))/2), (70+(count2*60)), 260, 62);
                    hawk[i].c.setBounds(50 + 270*count1, (70+(count2*60)), 273, 62);
                    frame.getContentPane().add(hawk[i].c,0);
                    frame.getContentPane().add(hawk[i].l,0);

                    count1++;
                }
            }
            }
        });
    }

    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("lol");

        EventQueue.invokeLater(new Runnable(){
                public void run(){

                    int count1 = 0; count2 = 0;

                    for(i=0;i<children.length;i++)
                    {


                    hawk[i]=new ConsoleApp(children[i]);

                    Iterator<String> it = hawk[i].p.iterator();

                    System.out.println("Hi:"+hawk[i].p.size());

                    while(it.hasNext())
                    {
                        hawk[i].call(it.next());

                        if(count1 == 3)
                        {
                            count2++;
                            count1=0;
                        }

                        hawk[i].l.setBounds((60 + 270*count1) + ((260-(hawk[i].l.getText().length()*7))/2), (70+(count2*60)), 260, 62);
                        hawk[i].c.setBounds(50 + 270*count1, (70+(count2*60)), 273, 62);
                        frame.getContentPane().add(hawk[i].c,0);
                        frame.getContentPane().add(hawk[i].l,0);

                        count1++;
                    }
                }
                }
            });


    }


}
4

3 に答える 3

2

actionPerformed は Runnable をトリガーします。これは、時間がかかり、中止したいものだと思います。Runnable の run メソッド内には、2 つのループfor(i=0;i<children.length;i++)while(it.hasNext()). これらのループに停止条件を追加すると、その条件を外部から制御することで Runnable を早期に終了させることができます。

たとえば、フィールドabortを vtm に追加し、2 つのループをそれぞれ and に変更しfor(i=0;i<children.length && !abort;i++)ますwhile(it.hasNext() && !abort)。ここで true に設定abortすると、Runnable は次にループを再試行したときに停止します。

于 2012-07-18T12:25:59.967 に答える
2

Runnable の代わりに Swingworker を使用します。これは、キャンセル メカニズムを実装する方法です: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/cancel.html

次の質問も参照してください: How do I use SwingWorker in Java?

于 2012-07-18T12:26:48.523 に答える
0

GUIで同期操作を呼び出すためにjavax.swing.timerを実装しています。ただし、その操作は完了するまでに時間がかかるため、そのタイマー呼び出しに中止オプションを提供したいと考えています。それは可能ですか?

実行中にイベント ディスパッチ スレッド (EDT) に投稿したものをキャンセルするための UI をユーザーに提供したい場合Runnable、それは不可能です。

コードの実行が開始された瞬間Runnable、UI スレッド (EDT) がRunnable. したがって、[キャンセル] ボタンや、考えていたインターフェイスは、終了するまでクリックしても反応しませんRunnable

実行を開始する前にキャンセルできますが、EDT で本当に重い作業を実行する必要があるかどうかを調査することをお勧めします (通常、答えはノーです)。workerThreadですべての重い計算/操作を実行し、実行中/実行後に UI を更新することをお勧めします。このSwingWorkerクラスはこの目的のために設計されており、その使用例の多くはオンラインで見つけることができます (javadoc、公式の Swing チュートリアル、およびこのサイト)。

于 2012-07-18T21:28:39.817 に答える