Animacja wciśnietego buttona

Odpowiedz Nowy wątek
2011-05-02 13:00
0

Cześć,

mam taki przykładowy kod

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;

public class MainClass {

  public static void main(String args[]) {
    String ACTION_KEY = "The Action";

    JFrame frame = new JFrame("KeyStroke Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton buttonA = new JButton("FOCUSED (control alt 7)");
    JButton buttonB = new JButton("FOCUS/RELEASE (VK_ENTER)");
    JButton buttonC = new JButton("ANCESTOR  (VK_F4+SHIFT_MASK)");
    JButton buttonD = new JButton("WINDOW (' ')");

    Action actionListener = new AbstractAction() {
      public void actionPerformed(ActionEvent actionEvent) {
        JButton source = (JButton) actionEvent.getSource();
        System.out.println("Activated: " + source.getText());
      }
    };

    KeyStroke controlAlt7 = KeyStroke.getKeyStroke("control alt 7");
    InputMap inputMap = buttonA.getInputMap();
    inputMap.put(controlAlt7, ACTION_KEY);
    ActionMap actionMap = buttonA.getActionMap();
    actionMap.put(ACTION_KEY, actionListener);

    KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true);
    inputMap = buttonB.getInputMap();
    inputMap.put(enter, ACTION_KEY);
    buttonB.setActionMap(actionMap);

    KeyStroke shiftF4 = KeyStroke.getKeyStroke(KeyEvent.VK_F4,
        InputEvent.SHIFT_MASK);
    inputMap = buttonC
        .getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    inputMap.put(shiftF4, ACTION_KEY);
    buttonC.setActionMap(actionMap);

    KeyStroke space = KeyStroke.getKeyStroke(' ');
    inputMap = buttonD.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    inputMap.put(space, ACTION_KEY);
    buttonD.setActionMap(actionMap);

    frame.setLayout(new GridLayout(2, 2));
    frame.add(buttonA);
    frame.add(buttonB);
    frame.add(buttonC);
    frame.add(buttonD);

    frame.setSize(400, 200);
    frame.setVisible(true);
  }
} 

I wszystko działa, kliknięcie kombinacji ctrl + alt + 7 wypisuje coś tam w konsoli. Problem polega na tym, że przy kliknięciu tej kombinacji button pozostaje nieruchomy. W jaki sposób można go 'wciskać', gdy wciśnięte są te 3 klawisze?

Pozdrawiam

Pozostało 580 znaków

2011-05-02 13:45
bo
1

JButtony maja metodę doClick().

Pozostało 580 znaków

2011-05-08 17:16
0

Twoje rozwiązanie:

     /**
     * Wizualnie wciska przycisk i wyzwala zdarzenie jego przyciśnięcia (keyPressed)
     * @param przycisk przycisk do wciśnięcia
     */
    public static void wciśnij(JButton przycisk)
    {
        ButtonModel m = przycisk.getModel();
        m.setArmed(true);
        m.setPressed(true);
        przycisk.paintImmediately(0, 0,
            przycisk.getWidth(), przycisk.getHeight());
    }

    /**
     * Wizualnie puszcza przycisk i wyzwala zdarzenie jego puszczenia (keyReleased)
     * @param przycisk
     */
    public static void puść(JButton przycisk)
    {
        ButtonModel m = przycisk.getModel();
        m.setPressed(false);
        m.setArmed(false);
        przycisk.paintImmediately(0, 0,
            przycisk.getWidth(), przycisk.getHeight());
    }

Dzięki tym dwóm metodom można mieć całkowita kontrolę nad buttonem z poziomu kodu. Można dzięki temu elegancko pokazać, że użytkownik ma pełną kontrolę nad GUI z poziomu klawiatury. Tutaj kontrola buttona potwierdzającego wprowadzenie stringa za pomocą JTextFielda mającego focus. Button będzie wciśnięty tak długo jak długo użytkownik będzie naciskał klawisz Enter. Jest to przydatne kiedy pole tekstowe ma obsługiwać klawisz Tab (shift-Tab) jako znak lub kiedy nie należy pozwolić na otrzymanie focusa przez przycisk.

        JTextField pTekstWe = new JTextField();
        JButton przycisk = new JButton("Potwierdź");
        //...
        JTextField pTekstWe.addKeyListener(new KeyAdapter()
        {
            @Override public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode() == KeyEvent.VK_ENTER)
                    wciśnij(przycisk);
            }
            @Override public void keyReleased(KeyEvent e)
            {
                if(e.getKeyCode() == KeyEvent.VK_ENTER)
                    puść(przycisk);
            }
        });
        przycisk.addActionListener(new ActionListener() //obsługa głównie z myszy
        {
            @Override public void actionPerformed(ActionEvent e)
            {
                puść(przycisk); //naciśnięcie z myszy wyłączy efekt przytrzymania Enter z klawiatury
                //...
            }
        });

Podobnie jest ze wszystkimi innymi kontrolkami Swinga. Można w pełni kontrolować ich działanie poprzez manipulacje ich modelu.
ps. Wszystkie te informacje znajdują się w tutorialu Suna.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 2x, ostatnio: Olamagato, 2011-05-08 17:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0