addKeyListener i minimalizacja

0

Witam, chce napisac program wykonujacy jakies dzialanie po nacisnieciu odpowiedniego klawisza. Np naciskam "a" i zmienia polozenie kursora. I tutaj pytanie, a w zasadzie 2pytania

  1. jak dodac keyListener w sposob niezalezny od zadnego elementu (dotychczas dodawalem np w jTextField, co wywolywalo jakies dzialanie po wpisaniu, a w zasadzie nacisnieciu danego klawisza ALE w polu jTextFIeld)

  2. program ma wykonywac swoje zalozenie nawet po zminimalizowaniu - jak to uzyskac (czy automatycznie bedzie to robil?)

0

nie wiem czy dobrze zrozumiałam co chciałbyś zrobić. Napiszę jak ja to zrozumiałam, a wiec:

chciałbyś, aby po naciśnięciu np literki "a", zmieniła się pozycja kursora.

Napisałam taki program, który na samym początku wyświetla napis: "pocztek!". Następnie jak użytkownik naciśnie literkę "a" zmienia się pozycję kursora. Zmieniając za każdym naciśnięciem literki "a" pozycję o:

 xMouseMove += 50; // współrzędna  x
 yMouseMove += 50; // współrzędna y

Jeśli użytkownik nic nie będzie naciskał wyświetli się napis "nic", jak naciśnie jedną z strzałek wyświetli się napis: "strzałki naciska". W momencie naciskania jakiegoś znaku, pojawia się napis: "jak naciska"
Kod przedstawia się następująco:

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.awt.Robot;

/*
 aby mieć możliwość skorzystania z obsługi klawiatury i myszki należy implementować dwa interfejsy:
 KeyListener, MouseMotionListener
*/
public class KeyListenerTester extends Frame implements KeyListener, MouseMotionListener {

    TextField t1;
    Label l1;

    public KeyListenerTester(String s) throws IOException {
        super(s);
        Panel p = new Panel();
        l1 = new Label("pocztek!");
        p.add(l1);
        add(p);
        addKeyListener(this);
        setSize(500, 500);
        setVisible(true);

        addMouseMotionListener(this);
        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    private KeyListenerTester() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public void keyTyped(KeyEvent e) {
        l1.setText("jak naciska");
    }

    public void keyPressed(KeyEvent e) {

        l1.setText("strzałki naciska");
    }

    public void mouseDragged(MouseEvent e) {
    }

    public void mouseMoved(MouseEvent e) {
    }
    int xMouseMove = 50;
    int yMouseMove = 50;

    public void keyReleased(KeyEvent e) {
// 65 - oznacza literkę "a"
        int znak = e.getKeyCode();
        if (znak == 65) {
            try {
                Robot robot = new Robot();
                xMouseMove += 50;
                yMouseMove += 50;
                robot.mouseMove(xMouseMove, yMouseMove);
            } catch (AWTException x) {
            }
        } else {
        }

        l1.setText("nic ");

    }

    public static void main(String[] args) throws IOException {
        new KeyListenerTester("Key Listener Tester");
    }

}

podczas pisania kodu korzystałam ze stron internetowych:
http://download.oracle.com/javase/tutorial/uiswing/examples/events/MouseMotionEventDemoProject/src/events/MouseMotionEventDemo.java
http://www.exampledepot.com/egs/java.awt/MoveMouse.html
http://www.khronos.org/message_boards/viewtopic.php?f=35&t=3295&start=15
http://www.roseindia.net/java/example/java/awt/how-to-use-keylistener.shtml

0

Myślę, że koledze bardziej zależy na założeniu globalnego haka na klawiaturę. Niestety z poziomu czystej Javy nie da się tego zrobić, musisz poszukać jakichś dodatkowych natywnych bibliotek. Forumowy kolega lipkerson lubi zabawy w wywoływanie WinAPI z poziomu Javy, które ja oficjalnie potępiam (bo to przeczy idei Javy), ale tutaj to byłoby niezbędne. Polecam po prostu zrezygnowanie z takiej funkcjonalności, wg mnie mało kto już to stosuje.

0

Tego się nie da uniwersalnie i prosto zrobić w aplikacji GUI bo takie działanie przeczy jej założeniom. Kiedy wciskasz klawisz, to zaczynając od źródła zdarzenia kod zawarty w klasach Swing (czyli również wszystkich komponentów) wyszukuje komponentu położonego najbardziej "na wierzchu" i posiadającego focus. Dopiero jeżeli w tym komponencie zdarzenie takie nie zostanie obsłużone, to "wędruje z powrotem", aż do dotarcia do okna najwyższego poziomu, który w Swingu jest "na samym dole". Tak więc okno takie obsłuży to zdarzenie, tylko gdy nie zostanie obsłużone przez żaden z komponentów (tak działają globalne skróty klawiszowe).
To o co Ci chodzi, to zablokowanie tej początkowej wędrówki zdarzenia, która jest w ogóle poza Twoją kontrolą. Można to łatwo zrobić pod warunkiem, że zwyczajnie nie ma żadnego komponentu GUI, czyli gdy piszesz aplikację pełnoekranową (lub taką, w której jedynym komponentem jest okno najwyższego poziomu). W praktyce tak właśnie pisze się gry, żeby móc całkowicie kontrolować zdarzenia klawiatury (i innych urządzeń również). Graficzny interfejs jakim jest Swing jest w takim wypadku zupełnie nieprzydatny, a wręcz przeszkadza.

ps. Da się używać Swinga do takiego celu, ale przy założeniu, że robimy coś w jakimś konkretnym komponencie oraz zablokuje się możliwość zmiany focusa przez samą klawiaturę.

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