tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1368
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Viprex Viprex ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    5
    Nachdem ich hier schon viele Antworten gefunden habe, jetzt meine 1. Frage:

    Ich möchte, dass auf Tastendruck von VK.DIVIDE sich ein Menu öffnet. Das Menu reagiert auf ALT+M, das ist kein Problem. Allerdings möchte ich das Menu eben auch auf das Keyevent VK.DIVIDE öffnen.
    Hat jemand eine Idee, wie ich das realisieren kann? Ich habe mir gedacht, ich fange das Keyevent VK.DIVIDE ab und führe dann die Aktion ALT+M aus. Nur finde ich leider keinen Weg, diesen Tastendruck ans System zu senden.
    Ich vermute, das könnte auch über Keyevents laufen, nur weiß ich leider nicht wie.

    Außerdem möchte ich, dass ich im dann aufgerufenen Menu mit den Pfeiltasten VK.UP und VK.DOWN navigieren kann.

    Hintergrund: Wie sollen eine Handyanwendung programmieren, die nur auf bestimmte Tasten reagiert. Diese Tasten senden eben nur die Keyevents des Nummerpads. Ich kann also nicht auf dem Bildschirm in der GUI rumklicken, sondern muss alles über die Nummernpadtasten steuern können.

    Ich danke euch für eure Antwort und Hilfestellung!

    Edit: Ich sehe, dass immer Java Code eingefügt wird, finde aber anscheinend nicht die richtigen Code-Tags. Im Editor stehen nur Tags für HTML, PHP und Code? Egal, nachfolgend nochmal mein Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    
    public class Add_1 extends Add {
     
        private static final long serialVersionUID = 1L;
     
        protected String getTitle() { return "Neuer Eintrag"; }
        protected String getLabelLeft() { return "Menu"; }
        protected String getLabelRight() { return "Entf"; }
        
        private JTextField _sumtext;
        private JFormattedTextField _datetext;
        private JTextField _commenttext;
        
        private JMenuBar _menuBar;
        private JMenu _menu;
        private JMenuItem _beendenM, _ausgabenM;  
            
        private int _focus = 0;
        
        public Add_1(MobileApp app) {
            super(app);
            _expense = new Expense();
            // if nothing is specified, create own data set.
            useData(_expense);
        }
        
        public Add_1(MobileApp app, Expense data) {
            super(app);
            // ...or gladly use the given one...
            useData(data);
        }
     
        protected JPanel getDialogContent() {       
            JPanel content = new JPanel();
            content.setLayout(new GridLayout(6,1));
            
            // sum label and input
            content.add(new JLabel("Betrag (in Cent)"));
            
            // input
            _sumtext = new JTextField();
            _sumtext.setDocument(new NumberDocument());
            _sumtext.setBorder(BorderFactory.createLineBorder(Color.red));
            content.add(_sumtext);
            
            // date label and input
            content.add(new JLabel("Datum"));
            
            // current date...
           _datetext = new JFormattedTextField();
           _datetext.setEditable(false);
           _datetext.setBorder(BorderFactory.createLineBorder(Color.gray));
            
           // date
            content.add(_datetext);
           
            
            // comment
            content.add(new JLabel("Kommentar"));
            _commenttext = new JTextField("");
            _commenttext.setBorder(BorderFactory.createLineBorder(Color.gray));
            content.add(_commenttext);
                    
            return content;
        }
        
     
        /**
         * Erstellt das Menu unten Links
         */
        public JMenuBar createMenuBar() 
        {                
            // Create the menu bar
            _menuBar = new JMenuBar();
            
            _menuBar.setBackground(Color.BLACK);
            _menuBar.setForeground(Color.WHITE);
            _menuBar.setOpaque(true); // otherwise the background is not drawn
            //_menuBar.setHorizontalAlignment(SwingConstants.CENTER);
            _menuBar.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));
            
            // Menu erstellen
            _menu = new JMenu(getLabelLeft());
            _menu.setBackground(Color.BLACK);
            _menu.setForeground(Color.WHITE);
            _menu.setOpaque(true); // otherwise the background is not drawn
            _menu.setMnemonic(KeyEvent.VK_M);
            _menu.getAccessibleContext().setAccessibleDescription("Das Menu");
     
            // MenuItem zu Beenden
            _beendenM = new JMenuItem("Beenden", KeyEvent.VK_B);  
            // Tastaturkürzel für _beendenM festlegen
            _beendenM.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.ALT_MASK));
            _beendenM.getAccessibleContext().setAccessibleDescription("Programm beenden");
            _menu.add(_beendenM);
            
            // Seperator zum Menu hinzufügen
            _menu.insertSeparator(1);
            
            // MenuItem zu Ausgaben
            _ausgabenM = new JMenuItem("Ausgaben", KeyEvent.VK_A);  
            // Tastaturkürzel für _ausgabenM festlegen
            _ausgabenM.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.ALT_MASK));
            _ausgabenM.getAccessibleContext().setAccessibleDescription("Ausgaben ansehen");
            _menu.add(_ausgabenM);
            
            _menu.setMenuLocation(-11,-56);
        
            //Listener für die Menuitems registrieren
            addListener();
            
            // das fertige Menu zur Menubar hinzufügen
            _menuBar.add(_menu);
            
            return _menuBar;
        }
        
        /**
         * Die Action Listener für die Menu Items registrieren
         */
        protected void addListener() {
            // Action auf Menuklick Beenden
            _beendenM.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("Beenden");
                }
            }
            );
            
            // Action auf Menuklick Ausgaben
            _ausgabenM.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("Ausgaben");
                }
            }
            );
        }
     
    ........ UNWICHTIGES RAUSGESCHNITTEN
     
    public boolean keyPressed(int keyCode) {
            if(keyCode == KeyEvent.VK_SUBTRACT) {
     
                JTextField field = null;
                if(_focus == 0) { field = _sumtext; }
                if(_focus == 1) { return true; } // del disabled for _datetext
                if(_focus == 2) { field = _commenttext; }
                          
                    int pos = field.getCaretPosition();
                    String t = field.getText();
        
                    // we can't delete something here
                    if(pos == 0) return true;
                    
                    // get the fucking char and kill it
                    int KILL = 1;
                    String first = t.substring(0, pos-KILL);
                    String end = t.substring(pos);
                    // nothing happened...
                    field.setText(first+end);
                    field.setCaretPosition(pos-1);
                    return true;
            }
            
            if(keyCode == KeyEvent.VK_DIVIDE) {
                //save changes
                saveFields();
                _focus=3;
                changeFocus();
                
                // next thing
                
                //Menu_add newOne = new Menu_add(_app);
                //_app.newDialog(newOne);
                return true;
            }
              
            if(_focus==1 && keyCode == KeyEvent.VK_LEFT) {
                Datumkram kram = new Datumkram();
                _datetext.setText(kram.dayMinus(_datetext.getText()));
                _datetext.setCaretPosition(0); 
            }
            if(_focus==1 && keyCode == KeyEvent.VK_RIGHT) {
                Datumkram kram = new Datumkram();
                _datetext.setText(kram.dayPlus(_datetext.getText()));
                _datetext.setCaretPosition(10); 
            }
            
            // next window
            if(keyCode == KeyEvent.VK_ENTER || keyCode == KeyEvent.VK_MULTIPLY) {
                //save changes
                saveFields();
                // next thing
                //Add_Category newOne = new Add_Category(_expense);
                //newOne.useData(_expense);
                //_app.newDialog(newOne);
                return true;
            }
            
            // down = bottom input field
            if(keyCode == KeyEvent.VK_DOWN) {
                _focus ++;
                if(_focus > 2) _focus = 0;
                changeFocus();
                return true;
            }
            // up = top input field
            if(keyCode == KeyEvent.VK_UP) {
                -- _focus;
                if(_focus < 0) _focus = 2;
                changeFocus();
                return true;
            }
     
            return false;
        }
        
        // there must be a better way...
        private void changeFocus() {
            if(_focus == 0)
            {
                _sumtext.requestFocus();
                _sumtext.setBorder(BorderFactory.createLineBorder(Color.red));
                _datetext.setBorder(BorderFactory.createLineBorder(Color.gray));
                _commenttext.setBorder(BorderFactory.createLineBorder(Color.gray));
                
            }
            if(_focus == 1) { 
                _datetext.requestFocus(); 
                _datetext.setCaretPosition(0); 
                _sumtext.setBorder(BorderFactory.createLineBorder(Color.gray));
                _datetext.setBorder(BorderFactory.createLineBorder(Color.red));
                _commenttext.setBorder(BorderFactory.createLineBorder(Color.gray));
            }
            if(_focus == 2) {
                _commenttext.requestFocus();
                _sumtext.setBorder(BorderFactory.createLineBorder(Color.gray));
                _datetext.setBorder(BorderFactory.createLineBorder(Color.gray));
                _commenttext.setBorder(BorderFactory.createLineBorder(Color.red));
            }
            if(_focus == 3) {
                _menu.requestFocus();
                _menu.setBackground(Color.red);
            }
        }
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Java Tags gibt es nicht im Editor auszuwählen, du kannst sie aber einfach hinschreiben... sieht aus wie die anderen Tags, steht halt nur Java drin. Das geht hier für ziemlich viele Sprachen.

    Wieso setzt du nicht einfach den VK_DIVIDE als Mnemonic für das Menü? Oder brauchst du das andere auch noch?

    Gehen die Pfeiltasten nicht automatisch? Ich dachte immer das wäre so.
     

  3. #3
    Viprex Viprex ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    5
    Zitat Zitat von zeja Beitrag anzeigen
    Wieso setzt du nicht einfach den VK_DIVIDE als Mnemonic für das Menü? Oder brauchst du das andere auch noch?
    Das habe ich probiert, die Mnemonic reagiert aber nur auf Alt+M. Setze ich sie auf VK.DIVIDE, dann reagiert sie weder auf / noch auf Alt+/

    Zitat Zitat von zeja Beitrag anzeigen
    Gehen die Pfeiltasten nicht automatisch? Ich dachte immer das wäre so.
    Ja, das dachte ich auch. Leider werden die blöden Pfeiltasten vorher durch die ganzen Keyevents abgefangen. Ich vermute, das ist einfach nur ein Focusproblem. Da schaue ich nochmal, wenn der korrekte Aufruf mit VK.DIVIDE des Menus funktioniert.
     

  4. #4
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    So nimm mal das Beispiel von:
    http://www.cs.cf.ac.uk/Dave/HCI/HCI_...ER/node79.html

    Und füg im Konstruktor hinter dem setSize(...) folgendes ein:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
     
    this.addKeyListener(new KeyAdapter() {
     
        @Override
        public void keyReleased(KeyEvent evt) {
            if (evt.getKeyCode() == KeyEvent.VK_F1) {
                System.out.println("F1 pressed");
                menuFile.doClick();
            }
        }
     
    });

    Das Menü "File" öffnet sich dann bei Taste F1.

    Die Pfeiltasten funktionieren auch... naja zumindest die normalen, auf dem Keypad habe ich keine (Notebook).
     

  5. #5
    Viprex Viprex ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    5
    Das bringt nichts. Der Keylistener liegt in einer anderen Klasse. Die Keys werden ja auch aufgerufen, das ist kein Problem. Leider geht der Menuaufruf nur mir ALT + /.
     

  6. #6
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Lies doch mal durch was ich da gepostet habe.... ich rufe auf den Tastendruck F1 das Menü File auf. Das ist doch dass was du brauchst!
     

  7. #7
    Viprex Viprex ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    5
    Entschuldige bitte, ich habe beim Nachvollziehen des Codebeispiels und deines Codeschnipsels menu.doClick() überlesen. Das war der entscheidende Hinweis. Alles andere funktioniert ja, daher habe ich zu früh abgeschaltet.

    Vielen vielen Dank für deine Hilfestellung und den entscheidenden Hinweis.


    Jetzt frage ich mich, ob es ein äquivalent doClick zum Schließen gibt. Habe leider nichts dergleichen gefunden.


    Viel wichtiger ist aber, dass ich gerne den Focus beim Öffnen des Menüs auf ein JMenuItem lenken möchte. Es gibt da allerhand Focusmethoden, bei mir funktioniert aber leider keine davon.

    Was ich mach:

    menu.requestFocus(), damit zuerst einmal das Menu den Focus bekommt.
    Auch probiert habe ich, dem JMemuItem mit JMenuItem.requestFocus() den Focus aufzudrücken. Geht auch nicht.

    Ich bekomme mit menu.getSelectedIcon() bekomme ich erwartungsgemäß null, da ja kein Item ausgewählt ist.

    Nochmal mein Problem: Ich kann leider nicht mit der Maus in das Menu klicken. Ich rufe das Menu mit einer Taste auf (menu.doClick) Dann muss der Focus ins Menu gelenkt werden, damit ich dort mit den Pfeiltasten navigieren und mit der Enter Taste etwas auswählen kann.

    Kann mir dabei vielleicht jemand Hilfestellung geben? Vielen lieben Dank!
     

  8. #8
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Ich bekomme mit menu.getSelectedIcon() bekomme ich erwartungsgemäß null, da ja kein Item ausgewählt ist.
    Du wirst da eigentlich immer null bekommen, wenn du kein SelectedIcon gesetzt hast.


    Eigentlich ist doch direkt das erste MenuItem gewählt und dann kann man doch mit den Pfeiltasten navigieren.


    MFG

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  9. #9
    Viprex Viprex ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    5
    Eigentlich hast du auch Recht, aber leider geht das in diesem Fall nicht, da die Up und Down Tasten vorhar abgefangen werden. Ich muss also per Hand das Menu traversieren nachbauen.

    Interessant ist dabei für mich auch, wie ich ein selektierten Menueintrag abfragen kann. Da muss ich bestimmt wieder einen Listener bemühen. Ich weiß nur nicht welchen der übermäßig vielen. Kann mir jemand einen Tipp geben?
     

Ähnliche Themen

  1. KeyEvent problem
    Von Holycrap im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 04.08.09, 10:13
  2. KeyEvent für Backslash
    Von Kayser im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 30.05.06, 09:41
  3. KeyEvent (MDA Compact)
    Von bremse im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 06.08.05, 11:37
  4. Problem mit KeyEvent
    Von sirconflex im Forum Java
    Antworten: 11
    Letzter Beitrag: 10.07.05, 11:36
  5. KeyEvent für ESC?
    Von SG_wXistenZ im Forum .NET Archiv
    Antworten: 6
    Letzter Beitrag: 26.03.05, 01:44