2011-12-23 9 views
0

f.e.私は電子メールクライアントを持っている、それは新しいメッセージを受信する、着信メッセージを持つボタンは何かをやって、ユーザーがそれを見るまでクリックするまで何かをやっている。Java swing:JButtonを選択/選択解除してパルスを模倣する

私はボタンを選択して待ってから選択を解除することで注目を集めようとしていますが、これは何もしません!

do{ 
     button.setSelected(true); 
       Thread oThread = new Thread() { 
        @Override 
        public void run() { 
         synchronized (this) { 
          try { 
           wait(1000); 
          } catch (InterruptedException e1) { 
           e1.printStackTrace(); 
          } 
         } 
         button.setSelected(false); 
        } 
       }; 
       oThread.start(); 
     }while(true); 
+1

焦点をつかんで重要性を示すものではありません。代わりにボタンのアイコンを赤色のバージョンから緑色(またはそれほど恐ろしい色の組み合わせ)に変更してみてください。 –

+0

@ bunnyjesse112質問--->あなたはJButton内部のテキストやJButton、またはJButtonと一緒に揺れてテストしたいですか? – mKorbel

+1

ボタンのアイコンをアニメーション化されたGIFで置き換える方法はありますか? –

答えて

5

スイングタイマーを使用する必要があります。外部スレッドからのGUIオブジェクトと対話しないでください。

Javaチュートリアルには、How to use Swing timersというドキュメントがあります。

ここでは、ボタンのアイコンを使用して再生する方法を示します。

// in constructor for example 
    buttonIcon = new ImageIcon("resources/icon.png"); 
    button.setIcon(buttonIcon); 

    timer = new Timer(1000, this); 
    timer.start(); 

// member var 
Icon buttonIcon; 
Timer timer; 
// in the actionPerformed handler 
    if (button.getIcon() == null) 
    button.setIcon(icon); 
    else 
    button.setIcon(null); 

あなたのクラスは、そのように動作するように、このためActionListenerを実装する必要があります。必要なときに点滅を停止するロジックを追加します。

4

ご質問hafl_workaround

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

public class ShakingButtonDemo implements Runnable { 

    private JButton button; 
    private JRadioButton radioWholeButton; 
    private JRadioButton radioTextOnly; 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new ShakingButtonDemo()); 
    } 

    @Override 
    public void run() { 
     radioWholeButton = new JRadioButton("The whole button"); 
     radioTextOnly = new JRadioButton("Button text only"); 
     radioWholeButton.setSelected(true); 
     ButtonGroup bg = new ButtonGroup(); 
     bg.add(radioWholeButton); 
     bg.add(radioTextOnly); 
     button = new JButton(" Shake with this Button "); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       shakeButton(radioWholeButton.isSelected()); 
      } 
     }); 
     JPanel p1 = new JPanel(); 
     p1.setBorder(BorderFactory.createTitledBorder("Shake Options")); 
     p1.setLayout(new GridLayout(0, 1)); 
     p1.add(radioWholeButton); 
     p1.add(radioTextOnly); 
     JPanel p2 = new JPanel(); 
     p2.setLayout(new GridLayout(0, 1)); 
     p2.add(button); 
     JFrame frame = new JFrame(); 
     frame.setTitle("Shaking Button Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(p1, BorderLayout.NORTH); 
     frame.add(p2, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private void shakeButton(final boolean shakeWholeButton) { 
     final Point point = button.getLocation(); 
     final Insets margin = button.getMargin(); 
     final int delay = 75; 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 30; i++) { 
        try { 
         if (shakeWholeButton) { 
          moveButton(new Point(point.x + 5, point.y)); 
          Thread.sleep(delay); 
          moveButton(point); 
          Thread.sleep(delay); 
          moveButton(new Point(point.x - 5, point.y)); 
          Thread.sleep(delay); 
          moveButton(point); 
          Thread.sleep(delay); 
         } else {// text only 
          setButtonMargin(new Insets(margin.top, margin.left + 3, margin.bottom, margin.right - 2)); 
          Thread.sleep(delay); 
          setButtonMargin(margin); 
          Thread.sleep(delay); 
          setButtonMargin(new Insets(margin.top, margin.left - 2, margin.bottom, margin.right + 3)); 
          Thread.sleep(delay); 
          setButtonMargin(margin); 
          Thread.sleep(delay); 
         } 
        } catch (InterruptedException ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     }; 
     Thread t = new Thread(r); 
     t.start(); 
    } 

    private void moveButton(final Point p) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       button.setLocation(p); 
      } 
     }); 
    } 

    private void setButtonMargin(final Insets margin) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       button.setMargin(margin); 
      } 
     }); 
    } 
} 
関連する問題