1

Java Swingコンポーネントのスライドショーとして(1つずつ)表示しようとしている文字列の配列があります。また、反復の間に遅延時間を追加しようとしています。

アクションリスナーを追加したJTextAreaを使用してこれを実行しようとしました。これが私が今持っているコードです:

private class myActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        // A BUNCH OF TEXT PROCESSING

        //NOTE: myInfo.getContents() returns an ArrayList<myType>.
        Iterator<myType> iterator = myInfo.getContents().iterator();

        int i = 0;
        while (iterator.hasNext()) {
            myTextArea.setText(iterator.next().toString());
            // to add time betweeen iterations i wanted to use the thread
            // delay method.
        }
    }
}

JTextAreaにアクションリスナーがないため、コードが機能していません。

更新 注:多くの回答で、JTextAreaにはActionListenerを使用する必要があると述べられています。ただし、Eclipseは、JTextAreaにaddActionListenerというメソッドがあることを示していません。

私はここで立ち往生していますが、このシナリオではどのJava Swingコンポーネントが最も適していると思いますか?

私の配列のテキストは長いかもしれないので、一行のラベルは良い選択ではありません。

他にどのような選択肢やアプローチがありますか?

どうもありがとうございました、どんな助けや提案も大歓迎です。

4

2 に答える 2

5

これは基本的な例で、@Robinによって投稿された提案に基づいています

public class TestDisplayString {

    public static void main(String[] args) {
        new TestDisplayString();
    }

    public TestDisplayString() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        private JTextArea textArea;
        private List<String> content;
        private Iterator<String> iterator;

        public TestPane() {
            readText();
            setLayout(new BorderLayout());
            textArea = new JTextArea(10, 40);
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);
            add(new JScrollPane(textArea));
            iterator = content.iterator();

            Timer timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (iterator.hasNext()) {
                        textArea.setText(iterator.next());
                    } else {
                        ((Timer)e.getSource()).stop();
                    }
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }

        protected void readText() {
            content = new ArrayList<>(25);
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/Text.txt")));
                String text = null;
                while ((text = reader.readLine()) != null) {
                    if (text.trim().length() > 0) {
                        content.add(text);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    reader.close();
                } catch (Exception e) {
                }
            }
        }

    }

}

これは「Text.txt」ファイルの内容です。

スイングタイマーの使い方

Swingタイマー(javax.swing.Timerのインスタンス)は、指定された遅延の後に1つ以上のアクションイベントを発生させます。Swingタイマーを、リリース1.3でjava.utilパッケージに追加された汎用タイマー機能と混同しないでください。このページでは、Swingタイマーについてのみ説明します。

一般に、GUI関連のタスクには汎用タイマーではなくSwingタイマーを使用することをお勧めします。これは、Swingタイマーはすべて同じ既存のタイマースレッドを共有し、GUI関連のタスクはイベントディスパッチスレッドで自動的に実行されるためです。ただし、タイマーからGUIに触れる予定がない場合、または長時間の処理を実行する必要がある場合は、汎用タイマーを使用できます。

Swingタイマーは次の2つの方法で使用できます。

To perform a task once, after a delay.
For example, the tool tip manager uses Swing timers to determine when to show a tool tip and when to hide it.
To perform a task repeatedly.
For example, you might perform animation or update a component that displays progress toward a goal.

スイングタイマーは非常に使いやすいです。タイマーを作成するときは、タイマーが「オフ」になったときに通知されるアクションリスナーを指定します。このリスナーのactionPerformedメソッドには、実行する必要のあるタスクのコードが含まれている必要があります。タイマーを作成するときに、タイマーが起動するまでのミリ秒数も指定します。タイマーを1回だけオフにする場合は、タイマーでsetRepeats(false)を呼び出すことができます。タイマーを開始するには、そのstartメソッドを呼び出します。一時停止するには、stopを呼び出します。

Swingタイマーのタスクは、イベントディスパッチスレッドで実行されることに注意してください。これは、タスクがコンポーネントを安全に操作できることを意味しますが、タスクを迅速に実行する必要があることも意味します。タスクの実行に時間がかかる場合は、タイマーの代わりに、またはタイマーに加えてSwingWorkerを使用することを検討してください。SwingWorkerクラスの使用方法と、マルチスレッドプログラムでのSwingコンポーネントの使用に関する情報については、Swingでの同時実行性を参照してください。

タイマーを使用してコンポーネントを定期的に更新する例を見てみましょう。TumbleItemアプレットは、タイマーを使用して定期的に表示を更新します。(このアプレットの実行を確認するには、「アプレットの作成方法」に進みます。このアプレットは、タイマーを作成して開始することから始まります。

timer = new Timer(speed、this); timer.setInitialDelay(pause); timer.start();

速度と一時停止の変数はアプレットのパラメータを表します。他のページで構成されているように、これらはそれぞれ100と1900であるため、最初のタイマーイベントは約1.9秒で発生し、0.1秒ごとに繰り返されます。これをTimerコンストラクターの2番目の引数として指定することにより、TumbleItemはそれがタイマーイベントのアクションリスナーであることを指定します。

タイマーを開始した後、TumbleItemはバックグラウンドスレッドで一連の画像の読み込みを開始します。その間、タイマーイベントが発生し始め、actionPerformedメソッドが実行されます。

public void actionPerformed(ActionEvent e){//まだロードしている場合、アニメートできません。if(!worker.isDone()){return; }

loopslot++;

if (loopslot >= nimgs) {
    loopslot = 0;
    off += offset;

    if (off < 0) {
        off = width - maxWidth;
    } else if (off + maxWidth > width) {
        off = 0;
    }
}

animator.repaint();

if (loopslot == nimgs - 1) {
    timer.restart();
} }

画像が読み込まれるまで、worker.isDoneはfalseを返すため、タイマーイベントは事実上無視されます。イベント処理コードの最初の部分は、アニメーションコントロールのpaintComponentメソッドで使用される値を設定するだけです。loopslot(アニメーションの次のグラフィックのインデックス)とoff(次のグラフィックの水平オフセット)です。

最終的に、loopslotは画像配列の最後に到達し、最初からやり直します。これが発生すると、actionPerformedの最後のコードがタイマーを再起動します。これを行うと、アニメーションシーケンスが再開する前に短い遅延が発生します。

于 2012-11-25T08:02:16.410 に答える
4

ActionListenerと組み合わせて使用​​しますjavax.Swing.Timer。にActionListener割り当てられたはTimer、指定された遅延で定期的に呼び出されます。

詳細については、タイマーのチュートリアルを参照してください

于 2012-11-25T07:03:09.807 に答える