4

私は保存ボタンを持っていますJFrame;クリックすると、「保存」テキストセットが「保存....」に保存されます。10秒遅れてそのテキストを「保存済み」として設定する必要があります.Javaでどのように可能ですか? 助けてください...

try {
    Thread.sleep(4000);
} catch (InterruptedException e) {

    e.printStackTrace();
}

これは私がやったことです...しかし、これはその遅延時間中に「保存」として表示されません。

4

3 に答える 3

7

何かが起こっているという視覚的なフィードバックをユーザーに提供したい場合(そしておそらく進行状況についてのヒントを与えたい場合)、次に進んでJProgressBarくださいSwingWorker詳細)。

一方、状況が必要な場合、ユーザーがボタンをクリックし、タスクがバックグラウンドで実行されることになっている場合(ユーザーが他のことをしている間)、次のアプローチを使用します。

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                                          
        button.setEnabled(false); // change text if you want
        new SwingWorker<Void, Void>() {
            @Override
            protected Void doInBackground() throws Exception {
                // Do the calculations
                // Wait if you want
                Thread.sleep(1000);
                // Dont touch the UI
                return null;
            }
            @Override
            protected void done() {
                try {
                    get();
                } catch (Exception ignore) {
                } finally {
                    button.setEnabled(true); // restore the text if needed
                }
            }                    
        }.execute();
    }
});

最後に、Swing特定のタイマーを使用していた最初のソリューション:

final JButton button = new JButton("Save");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                                          
        // Take somehow care of multiple clicks
        button.setText("Saving...");
        final Timer t = new Timer(10000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                button.setText("Saved");
            }
        });
        t.setRepeats(false);
        t.start();
    }
});
于 2012-04-10T07:46:56.513 に答える
7

この質問と最初の 3 つの回答は、間違った道を進んでいます。

  • a を使用して、JProgressBar何かが起こっていることを示します。タスクの長さが不明な場合は不定に設定しますが、保存する必要がある量と現在保存されている量はわかっていると思われます。
  • EDT (Event Dispatch Thread) をブロックしないでください。ブロックすると、GUI が「フリーズ」します。SwingWorker実行時間の長いタスクには a を使用します。詳細については、Swingでの同時実行を参照してください。
于 2012-04-10T08:39:38.203 に答える
2

タイマーを使用すると、そのメソッドが遅延して実行されるのが最善です:http ://developer.apple.com/library/mac/documentation/java/reference/javase6_api/api/java/util/Timer.html#schedule(java .util.TimerTask、long)。タイマータスクを使用してランナブルをラップします。それだけです。

于 2012-04-10T07:44:49.787 に答える