【问题标题】:Java swing: selecting/deselecting JButton to imitate pulsingJava swing:选择/取消选择 JButton 以模仿脉冲
【发布时间】:2011-12-23 10:24:13
【问题描述】:

f.e.我有一个电子邮件客户端,它接收新消息,带有传入消息的按钮开始执行某些操作,直到用户单击它以查看发生了什么。

我试图通过选择、等待然后取消选择按钮来吸引注意力,但这没有任何作用!

 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);

【问题讨论】:

  • 不要通过抓住焦点来表明重要性。尝试将按钮图标从红色版本更改为绿色(或一些不那么可怕的颜色组合)。
  • @bunnyjesse112 question ---> 你是想用 JButton 内的 Text 摇晃还是用 JButton 摇晃,还是用 JButton 和 Test 摇晃???
  • 用脉冲动画 GIF 替换按钮图标怎么样?
  • @mKorbel 摇晃?我对"Shake, (rattle & roll)" 很熟悉(是的,我就是那个 Ancient1()),但“摇晃”与此有什么关系? 1) (好吧,比我早了十年,但仍然是一首他妈的经典曲目。)
  • @AdriaanKoster +1,是的,喜欢这个建议。

标签: java swing selection jbutton


【解决方案1】:

您应该为此使用 Swing 计时器。不要与来自外部线程的 GUI 对象交互。

Java 教程中有一些文档:How to use Swing timers

这里有一个示例方法,您可以使用按钮的图标来做到这一点。

// member var
Icon buttonIcon;
Timer timer;
  // in constructor for example
  buttonIcon = new ImageIcon("resources/icon.png");
  button.setIcon(buttonIcon);

  timer = new Timer(1000, this);
  timer.start();
   // in the actionPerformed handler
   if (button.getIcon() == null)
     button.setIcon(icon);
   else
     button.setIcon(null);

您的班级需要实现ActionListener 才能这样工作。添加一些逻辑以在需要时停止闪烁。

【讨论】:

    【解决方案2】:

    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);
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2011-01-08
      • 2017-03-17
      • 1970-01-01
      相关资源
      最近更新 更多