KeyListener, key bindings czy ?

0

Witam,

Mam poważny problem z implementacja zdarzeń klawiaturowych, dokładnie chodzi o odczytanie kodu paskowego. Ale zostawmy czytnik, jest to identyczne zdarzenie jak te wysłane z klawiatury, trzeba tylko zebrać w buforze wszystkie znaki do momentu znaku nowej linii itd.

Wracając do problemu, aplikacja zawiera masę przycisków, tabel, ogólnie różnych komponentów, problem polega na tym, że powinna ona w każdym momencie zareagować na zdarzenie czytania kodu paskowego (po prostu kilka znaków z klawiatury), najbardziej oczywistym rozwiązaniem było by dodać do każdego komponentu keylistener - takie to rozwiązanie biorę ewentualnie pod uwagę, ale według mnie jest to bardzo nie uniwersalne, kod straci przejrzystość, będzie trudny w diagnozowaniu (komponentów jest naprawdę dużo).

Kolejnym rozwiązaniem jest key bindings, ale tutaj musiałbym zdefiniować wszystkie możliwe znaki, jakie mogą wystąpić w kodzie paskowym – pyzatym nie wiem za bardzo jak odczytać kod znaku i rozpoznać „ENTER” , można też skorzystać z KeyStroke.getKeyStrokeForEvent(e), ale wtedy muszę mieć Keyistener - czyli wracam do pierwszego rozwiązania.

Moje pytanie brzmi, czy ktoś może ma jakiś pomysł, jakieś inne rozwiązanie, może ja źle interpretuje przedstawione tutaj mechanizmy.

Pozdrawiam.

0

Jeżeli będziesz koniecznie zapisywał KeyListener jako klasę anonimową to rzeczywiście kod może stać się nieprzejrzysty.
Ja jednak polecam popatrzeć tutaj:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Window.html#addWindowListener(java.awt.event.WindowListener)

Można dodać jeden listener na oknie programu.

0

Niestety, pomysł z window wydał się fajny, sprawdziłem i MouseListener faktycznie dział, ale KeyListener nie chce :(

Oto istotny wycinek kodu:


public static void main(String[] args) {
        JFrame f;
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gs = ge.getScreenDevices();
        
        
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                f = new javax.swing.JFrame();
          
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                
                Window win = new Window(f);
                //win.setFocusable(true);
                //win.addMouseListener(new AplicationClosingMouseCLickListener());

                win.addKeyListener(new KeyListener(){

                    public void keyTyped(KeyEvent e) {
                        System.out.println("1");
                    }

                    public void keyPressed(KeyEvent e) {
                       System.out.println("2");
                    }

                    public void keyReleased(KeyEvent e) {
                       System.out.println("3");
                    }
                    
                });
                
                mainPanel2 = new MainPannel();
                
                win.add(mainPanel2, BorderLayout.CENTER);

                win.validate();

                if(gs[0].isFullScreenSupported())
                    gs[0].setFullScreenWindow(win);
        
                
                
            }});
    }

MainPannel() - to rozszerzona klasa JPanel na której umieszczone są pozostałe elementy.

Pozdrawiam.

0

Chyba robisz tu jakiś zasadniczy błąd. Powodem dla którego w Swingu (czy dowolnym GUI) źródłem zdarzenia wprowadzania znaków jest prawie każdy możliwy komponent wizualny jest otrzymywanie fokusu. To tak jakby na każdym najmniejszym przycisku, etykietce, okienku była mała klawiaturka. Natomiast zdarzenia przychodzące dla urządzeń takich jak czytniki kodu kreskowego nie powinny mieć swojego źródła w komponentach ekranowych, ale w urządzeniu. W prawidłowo zaprojektowanym systemie tak to powinno działać. Rejestrujesz procedurę obsługi z jednego źródła i koniec. To tak samo jak rejestrujesz procedurę obsługi dla jednego wybranego egzemplarza obiektu przycisku.
Porównanie odczytywania kodów kreskowych do wprowadzania danych dla GUI nie jest właściwe.
Zresztą nawet w GUI możesz odczytać znaki wprowadzone w całej aplikacji bez względu na to jaki element ma fokus. Po prostu zdarzenia nie obsłużone w najmniejszym komponencie przechodzą do komponentów je obejmujących (tych bardziej "z tyłu"), aby na końcu trafić do obsługi zdarzeń głównego okna.

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