2016-12-28 2 views
0

私はJButtonの背景色をツイニングしようとしていますが、動作しているのは「スリープ」だけです。JComponentの背景色をどのようにツインクリングするのですか?

マイコード:

@Override 
public void actionPerformed(ActionEvent e){ 

    if(!empty){ 
    }else{ 
    myButton.setBackground(Color.RED); 
    try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e2){} 
    myButton.setBackground(Color.LIGHT_GRAY); 
    try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e1) {} 
    myButton.setBackground(Color.RED); 
    try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e1) {} 
    myButton.setBackground(Color.LIGHT_GRAY); 
    } 
    } 
} 

EDIT: は全体のコード、非常に多くの行を転記することはできません。 ボタンがGridBagLayoutの内側にある:

myButton= new Jbutton("Button!"); 
myButton.setBackground(Color.White); 
myButton.setHorizontalAlignment(JTextField.CENTER);; 
myButton.setForeground(Color.black); 
GridBagConstraints gbc_myButton = new GridBagConstraints(); 
gbc_myButton.fill = GridBagConstraints.BOTH; 
gbc_myButton.gridx = 0; 
gbc_myButton.gridy = 1; 
gbc_myButton.gridwidth=3; 
panel.add(myButton, gbc_myButton); 

EDIT 2: 私はちょうどそれが(または任意の遅延/スリープなし)、実行時に任意の色を設定していない把握します。

+0

はあなたが何を意味するかsetBackgroundの呼び出しによって背景を変更しませんか? – ItamarG3

+0

遅延は機能しますが、色は変わりません。 – tomyforever

+0

a)200ミリ秒は非常に短いですが、スリープ時間を長くしてください。 b)あなたはそのコードをループしていますか? – ItamarG3

答えて

2

このようなアニメーションを行うには、javax.swing.Timerを使用する必要があります。

final Button b = ...; 
final Color[] colors = ...; 
colors[0] = Color.RED; 
colors[1] = Color.LIGHT_GREY; 
ActionListener al = new ActionListener() { 
    int loop = 0; 
    public void actionPerformed(ActionEvent ae) { 
    loop = (loop + 1) % colors.length; 
    b.setBackground(colors[loop]); 
    } 
} 

new Timer(200, al).start(); 

注:すべてのコンポーネント/ JComponentのは実際には「だけで `sleep`が取り組んでいる」

+0

クラスからActionListenerオブジェクトを取得するにはどうすればよいですか?あなたは新しいものを作成しているからです。新しいTime(200、this)を実行すると、actionPerformed()の1行目にNullPointerが与えられます。 – tomyforever

+0

私はあなたの質問を理解していません。どこでActionListenerを取得しようとしていますか?新しい時間は何ですか(200、これ)?また、actionPerformedの最初の行でNullPointerExceptionが発生している場合は、実際に色を 'colors'配列に入れていないことを意味します。 – ControlAltDel

+0

私のクラスを実装していたActionListenerを使用しなければならないと思いました。 https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html https://docs.oracle.com/javax/swing/Timer.html全文を読んだ後、私は自分のクラスのactionPerformedの中に新しいActionListenerがあることを理解しています。それから、あなたのコードを試しました。色は変化していますが、ループは停止しません。 – tomyforever

0

問題は、(TimeUnit...sleep(x)を介して)UIスレッドをスリープさせると、変更を再描画できなくなることです。私は最後の色がレンダリングされると確信しています。

色の変更を引き起こす別の方法を見つける必要があります。タイマー、特にスイングタイマーを見てください。

+0

(1-)Swingコンポーネントは、Event Dispatch Thread(EDT)で更新する必要があります。だから、あなたはスイングタイマーを使うべきであり、そのリンクで言及されている他のタイマーではありません。 – camickr

+0

@camickrはい他のタイマーは適切ではありません。 – weston

関連する問題