1

背景(JTextAreaの)を赤に変更してフラッシュ効果を作りたい->次に1秒待って->白に戻る。私はこれが好きです:

JTextArea jTextArea = new JTextArea();
jTextArea.setBackGround(Color.RED);
Thread.currentThread().sleep(1000);
jTextArea.setBackGround(Color.WHITE)

しかし、うまくいきません。私が持っているのは白い背景だけです。赤い背景は見えません。

何が間違っていますか?

ありがとう!

4

3 に答える 3

4

GUI をフリーズさせるを使用する代わりに、javax.swing.TimerThread.sleep(...)を使用する必要があります。さらに、@MinhCatVO がよく言っているように、GUI の更新は EDT で行う必要があります。このトピックの詳細については、Swing での同時実行を参照してください。以下のコードを見て、理解できないことを尋ねてください。

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

public class ColouringTextArea
{
    private JTextArea tarea;
    private Timer timer;
    private Color[] colours = {
                                Color.RED,
                                Color.BLUE,
                                Color.GREEN.darker(),
                                Color.DARK_GRAY,
                                Color.MAGENTA,
                                Color.YELLOW
                              };
    private int counter = 0;                          
    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            if (counter < colours.length)
            {
                tarea.setBackground(colours[counter]);
                counter++;
            }
            else
            {
                tarea.setBackground(Color.PINK);
                counter = 0;
            }   
        }
    };

    private void displayGUI()
    {
        JFrame frame = new JFrame("Colouring JTextArea");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        tarea = new JTextArea(10, 10);
        contentPane.add(tarea);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        timer = new Timer(1000, timerAction);
        timer.start();
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ColouringTextArea().displayGUI();
            }
        });
    }
}
于 2012-08-10T16:52:30.650 に答える
1

スレッド化の問題のため、これは機能しません。Worker Threadが必要です。

これはうまくいくはずです:

            SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
                @Override
                protected Object doInBackground() throws Exception {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            jTextArea.setBackground(Color.RED);
                        }
                    });
                    Thread.sleep(1000);
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            jTextArea.setBackground(Color.WHITE);
                        }
                    });
                    return null;
                }
            };

            sw.execute();

Swing オブジェクトのすべてのメソッドは、イベント ディスパッチ スレッドから呼び出す必要があることに注意してください。これを行うには、次のパターンを使用します。

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            // Do gui things
        }
    });

イベント ディスパッチャ スレッドについて学習します。SOにはこれに関する非常に多くの投稿があります。単語を検索するだけです。

于 2012-08-10T16:57:22.867 に答える
1

1秒間スリープしたいスレッドはGUIスレッドではないためです。Swing.Utilities には SwingUtilities.invokeLater() メソッドがあると思います。

public void class Flash extends Thread {
  JTextArea jtextArea = new JTextArera();
  public void run() {
   SwingUtilities.invokeLater(new Runnable()) {
      jTextArea.setBackground(Color.WHITE);
   }
  }
}

public void class Main {
   public void main() {
      ...
      Flash fl = new Flash();
      fl.start();
   }
}
于 2012-08-10T16:42:18.173 に答える