Java swing: выбор / отмена выбора JButton для имитации пульсации - PullRequest
0 голосов
/ 23 декабря 2011

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

Ответы [ 2 ]

5 голосов
/ 23 декабря 2011

Вы должны использовать таймеры Swing для этого.Не взаимодействуйте с объектами GUI из сторонних потоков.

В руководстве по Java есть несколько документов: Как использовать таймеры Swing .

Вот пример того, как вы можете сделатьэто игра со значком кнопки.

// 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, чтобы это работало так.Добавьте некоторую логику, чтобы остановить мигание, когда вам это нужно.

4 голосов
/ 23 декабря 2011

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