# Funktionstasten



## cam (17. Nov 2008)

Hallo,

nachdem mir bei Netbeans ständig die JInternalFrames nicht mehr angezeigt werden, hab ich nun auf Eclipse ganymede gewechselt und alles "per Hand" geschrieben.

Mein Problem ist nun, dass ich die Funktionstasten nicht zum funktionieren bringen kann und ich verstehe nicht warum?
Mein Code sieht folgendermaßen aus:

Main.java:

```
import javax.swing.JFrame;

import forms.Frame;

@SuppressWarnings("serial")
public class Main extends JFrame{
    
	public Main() {
		super();  
	}
	
	public static void main(String[] args) {
		
        Frame fenster = new Frame(); 
        fenster.setTitle("Lagerverwaltung");
        fenster.setSize(1024, 768);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        
	}
}
```

Frame.java:

```
package forms;
import javax.swing.*;
import javax.swing.event.*;

import java.awt.*;
import java.awt.event.*;

import listener.Start1KeyListener;

@SuppressWarnings("serial")
public class Frame extends JFrame {
   
    private JPanel hintergrund;
    private JDesktopPane desktop;
    
    private JInternalFrame login;
    private JLabel benName;
    private JLabel pass;
    private JTextField txtBenName;
    private JPasswordField txtPass;
    private JButton btAnmelden;
    private JButton btAbbrechen;
    private JPanel benNamePanel;
    private JPanel passPanel;
    private JPanel btLoginPanel;
    
    private JInternalFrame start1;
    private JLabel neuEinl;
    private JLabel wiederEinl;
    private JLabel matAnf;
    private JLabel ausl;
    private JLabel benAb;
    private JLabel prgEnde;
    
    private JInternalFrame mask2;
    private JLabel eingArtNr;
    private JLabel eingMenge;
    private JLabel weiter2;
    private JLabel abbr2;
    private JTextField txtEingArtNr;
    private JTextField txtEingMenge;
    private JPanel befMask2Panel;
    
    private JMenuBar menu;
    
    private JMenu ende;
    private JMenu einaus;
    private JMenu stamm;
    private JMenu aktDat;
    private JMenu ausw;
    private JMenu extras;
    private JMenu hilfe;
    
    private JMenuItem system;
    private JMenuItem ausman;
    private JMenuItem einman;
    
    private JMenuItem art;
    private JMenuItem lagpl;
    
    private JMenuItem rueckli;
    private JMenuItem matanf;
    private JMenuItem best;
    
    private JMenuItem lagDruck;
    private JMenuItem bewDat;
    
    private JMenuItem berAend;
    private JMenuItem sEinr;
    private JMenuItem etAend;
    private JMenuItem opt;
    private JMenuItem nutzVerw;
    private JMenuItem passAend;
    private JMenuItem info;
    private JMenuItem druck;
    
    private JSeparator separatorEA;
    private JSeparator separatorExt;
    
    /**
     * Konstruktor
     */
    
    public Frame(){
   	
        hintergrund = new JPanel();
        setContentPane(hintergrund); //Methode der Klasse JFrame
        
        desktop = new JDesktopPane();
        
    	login = new JInternalFrame("Nutzeranmeldung");
        login.getContentPane().setLayout(new GridLayout(3, 1));
        login.setSize(319, 169);
        login.setLocation(352, 300);
        login.setVisible(true);
        benName = new JLabel("Benutzername");
        benName.setPreferredSize(new java.awt.Dimension(90, 50));
        pass = new JLabel("Passwort");
        pass.setPreferredSize(new java.awt.Dimension(90, 25));
        txtBenName = new JTextField();
        txtBenName.setPreferredSize(new java.awt.Dimension(200, 25));
        txtPass = new JPasswordField();
        txtPass.setPreferredSize(new java.awt.Dimension(200, 25));
        btAnmelden = new JButton("Anmelden");
        btAnmelden.addActionListener(new ActionListener(){
        	public void actionPerformed(ActionEvent event){
        		if(event.getActionCommand().equals("Anmelden")){
        			login.setVisible(false);
        			start1.setVisible(true);
        		}
        	}
        });
        btAbbrechen = new JButton("Abbrechen");
        btAbbrechen.addActionListener(new ActionListener(){
        	public void actionPerformed(ActionEvent event){
        		if(event.getActionCommand().equals("Abbrechen")){
        			System.exit(0);
        		}
        	}
        });
        benNamePanel = new JPanel();
        benNamePanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        benNamePanel.add(benName);
        benNamePanel.add(txtBenName);
        passPanel = new JPanel();
        passPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        passPanel.add(pass);
        passPanel.add(txtPass);
        btLoginPanel = new JPanel();
        btLoginPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        btLoginPanel.add(btAnmelden);
        btLoginPanel.add(btAbbrechen);
        login.add(benNamePanel);
        login.add(passPanel);
        login.add(btLoginPanel);
                
        start1 = new JInternalFrame("Hauptmenü");
        start1.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
        start1.setSize(287, 175);
        start1.setLocation(352, 300);
        start1.setBackground(new java.awt.Color(255, 255, 196));
        start1.setClosable(true);
        start1.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
        start1.setVisible(false);
        neuEinl = new JLabel("F1 - Neu Einlagern");
        neuEinl.setPreferredSize(new java.awt.Dimension(150, 15));
        wiederEinl = new JLabel("F2 - Wieder Einlagern");
        wiederEinl.setPreferredSize(new java.awt.Dimension(150, 15));
        matAnf = new JLabel("F3 - Materialanforderung");
        matAnf.setPreferredSize(new java.awt.Dimension(150, 15));
        ausl = new JLabel("F4 - Auslagern");
        ausl.setPreferredSize(new java.awt.Dimension(150, 15));
        benAb = new JLabel("F5 - Benutzer abmelden");
        benAb.setPreferredSize(new java.awt.Dimension(150, 15));
        prgEnde = new JLabel("F6 - Programm beenden");
        prgEnde.setPreferredSize(new java.awt.Dimension(150, 25));
        start1.add(neuEinl);
        start1.add(wiederEinl);
        start1.add(matAnf);
        start1.add(ausl);
        start1.add(benAb);
        start1.add(prgEnde);
        start1.addKeyListener(new Start1KeyListener(start1, mask2));
                
        mask2 = new JInternalFrame("Einlagern M2");
        mask2.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
        mask2.setSize(287, 175);
        mask2.setLocation(352, 300);
        mask2.setBackground(new java.awt.Color(255, 255, 196));
        mask2.setClosable(true);
        mask2.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
        mask2.setVisible(false);
        eingArtNr = new JLabel("Bitte geben Sie die Artikelnummer ein!");
        eingArtNr.setPreferredSize(new java.awt.Dimension(225, 15));
        eingMenge = new JLabel("Bitte geben Sie die Menge ein!");
        eingMenge.setPreferredSize(new java.awt.Dimension(225, 15));
        weiter2 = new JLabel("F1 - Weiter");
        weiter2.setPreferredSize(new java.awt.Dimension(80, 25));
        abbr2 = new JLabel("F2 - Abbruch");
        abbr2.setPreferredSize(new java.awt.Dimension(80, 25));
        txtEingArtNr = new JTextField();
        txtEingArtNr.setPreferredSize(new java.awt.Dimension(225, 25));
        txtEingMenge = new JTextField();
        txtEingMenge.setPreferredSize(new java.awt.Dimension(225, 25));
        befMask2Panel = new JPanel();
        befMask2Panel.setBackground(new java.awt.Color(255, 255, 196));
        befMask2Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
        befMask2Panel.add(weiter2);
        befMask2Panel.add(abbr2);
        mask2.add(eingArtNr);
        mask2.add(txtEingArtNr);
        mask2.add(eingMenge);
        mask2.add(txtEingMenge);
        mask2.add(befMask2Panel);

        
        menu = new JMenuBar();
        
        ende = new JMenu("1 Beenden");
        ende.setMnemonic(KeyEvent.VK_1);
        ende.addMenuListener(new MenuListener(){
			public void menuCanceled(MenuEvent arg0) {}   //Dummy zwecks Interface
			public void menuDeselected(MenuEvent arg0) {} //Dummy zwecks Interface
			public void menuSelected(MenuEvent arg0) {
				System.exit(0);		
			}
        });
        ende.addMenuKeyListener(new MenuKeyListener(){
			public void menuKeyPressed(MenuKeyEvent e) {}
			public void menuKeyReleased(MenuKeyEvent e) {}
			public void menuKeyTyped(MenuKeyEvent e) {}
        });
        
        einaus = new JMenu("2 Ein-/Auslagern");
        stamm = new JMenu("3 Stammdaten bearbeiten");
        aktDat = new JMenu("4 Aktuelle Daten");
        ausw = new JMenu("5 Auswertungen");
        extras = new JMenu("6 Extras");
        hilfe = new JMenu("7 Hilfe");
        
        system = new JMenuItem("1 Systemgesteuert");
        ausman = new JMenuItem("2 Auslagern manuell");
        einman = new JMenuItem("3 Einlagern manuell");
        
        art = new JMenuItem("1 Artikel");
        lagpl = new JMenuItem("2 Lagerplätze");
        
        rueckli = new JMenuItem("1 Rückstandsliste");
        matanf = new JMenuItem("2 Materialanforderungsliste");
        best = new JMenuItem("3 Bestand");
        
        lagDruck = new JMenuItem("1 Lagerbelegung drucken");
        bewDat = new JMenuItem("2 Bewegungsdaten");
        
        berAend = new JMenuItem("1 Berichte ändern");
        sEinr = new JMenuItem("2 Seite einrichten");
        etAend = new JMenuItem("3 Etiketten ändern");
        opt = new JMenuItem("4 Optionen");
        nutzVerw = new JMenuItem("5 Nutzerverwaltung");
        passAend = new JMenuItem("6 Passwort ändern");
        info = new JMenuItem("7 Info");
        druck = new JMenuItem("8 Druckerauswahl");
        
        separatorEA = new JSeparator();
        separatorExt = new JSeparator();
        
        einaus.add(system);
        einaus.add(separatorEA);
        einaus.add(ausman);
        einaus.add(einman);
        
        stamm.add(art);
        stamm.add(lagpl);
        
        aktDat.add(rueckli);
        aktDat.add(matanf);
        aktDat.add(best);
        
        ausw.add(lagDruck);
        ausw.add(bewDat);
        
        extras.add(berAend);
        extras.add(sEinr);
        extras.add(etAend);
        extras.add(opt);
        extras.add(nutzVerw);
        extras.add(passAend);
        extras.add(separatorExt);
        extras.add(info);
        extras.add(druck);
        
        menu.add(ende);
        menu.add(einaus);
        menu.add(stamm);
        menu.add(aktDat);
        menu.add(ausw);
        menu.add(extras);
        menu.add(hilfe);
        
        setJMenuBar(menu);
        
        desktop.add(login);
        desktop.add(start1);
        desktop.add(mask2);
 
        setLayout(new GridLayout(1, 1));
        hintergrund.add(desktop);
        
    }
    
    /**
     * Aufbau des Fensters
     */
    
    public void main(){

    }
}
```

Start1KeyListener.java:

```
package listener;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JInternalFrame;

import forms.Frame;

public class Start1KeyListener implements KeyListener{
	
	Frame start1 = null;
	Frame mask2 = null;
	
	public Start1KeyListener(JInternalFrame start1, JInternalFrame mask2){
		start1 = new JInternalFrame();
		mask2 = new JInternalFrame();
	}

	@Override
	public void keyPressed(KeyEvent event) {
		if (event.getKeyCode() == KeyEvent.VK_F1) {
			start1.setVisible(false);
			mask2.setVisible(true);
		}
	}

	@Override
	public void keyReleased(KeyEvent event) {

	}

	@Override
	public void keyTyped(KeyEvent event) {

	}

}
```

Ich habe das mit dem KeyBinding auch schon probiert, aber geht auch nicht 
 :cry: 

Liegt es vielleicht daran, dass ich die Funktionstasten in den verschiedenen JInternalFrames verwenden will?

Bitte helft mir!

cam


----------



## Wildcard (17. Nov 2008)

cam hat gesagt.:
			
		

> Ich habe das mit dem KeyBinding auch schon probiert, aber geht auch nicht
> :cry:


Genau das solltest du aber tun. Was hast du versucht?
Hier nochmal die Anleitung falls du sie nicht kennst
http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html


----------



## cam (17. Nov 2008)

Ich habe jetzt das noch einmal probiert:


```
start1.getInputMap().put(KeyStroke.getKeyStroke("released F1"), "released");
        start1.getActionMap().put("released", mask2.setVisible(true));
```

Es erscheint folgende Fehlermeldung: 

The method put(Object, Action) in the type ActionMap is not applicable for the arguments (String, void)


----------



## SlaterB (17. Nov 2008)

na in diesem Fall musst du doch differenzieren, ob
> Ich habe das mit dem KeyBinding auch schon probiert, aber geht auch nicht 

bedeutet, dass du das korrekt einsetzen kannst und es nicht die gewünschte Funktionalität liefert,
oder du das als neues Feature noch gar nicht programmieren kannst!
--------

> start1.getActionMap().put("released", mask2.setVisible(true));

du schreibst doch auch 
> start1.addKeyListener(new Start1KeyListener(start1, mask2)); 
und nicht
> start1.addKeyListener(start1.setVisible(false); 


also ist dir doch das System von Listenern und anonymen inneren Klassen bekannt,
bei der Action ist das genauso, siehe Tutorial,

einfach einen Befehl zu übergeben macht doch keinen Sinn


----------



## cam (17. Nov 2008)

Also anscheinend kann ich es nicht programmieren...


----------



## SlaterB (17. Nov 2008)

und auch nicht die fertigen Beispiele im Tutorial anschauen oder mit Worten beschreiben, woran es scheitert?


----------



## cam (17. Nov 2008)

Das ist der letzte Versuch gewesen...

Fehlermeldung hier:
The method put(Object, Action) in the type ActionMap is not applicable for the arguments (String, new KeyListener(){})	



```
start1.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "released");
        start1.getActionMap().put("released", new KeyListener(){

			@Override
			public void keyPressed(KeyEvent arg0) {}

			@Override
			public void keyReleased(KeyEvent event) {
				if (event.getKeyCode() == KeyEvent.VK_F1) {
					start1.setVisible(false);
					mask2.setVisible(true);
				}			
			}

			@Override
			public void keyTyped(KeyEvent arg0) {}
        	
        });
```


----------



## cam (17. Nov 2008)

Also, hab beim Suchen noch folgendes hier im Forum gefunden:


```
KeyStroke einl = KeyStroke.getKeyStroke((char) KeyEvent.VK_F1);
        start1.registerKeyboardAction(action, einl, start1.WHEN_IN_FOCUSED_WINDOW);
        ActionListener action = new ActionListener(){
              public void actionPerformed(ActionEvent actionEvent){
                 start1.setVisible(false);
              }
           };
```

Aber natürlich kennt er doch action nicht, bevor der ActionListener aufgerufen wird?


----------



## SlaterB (17. Nov 2008)

hier ein paar entscheidene Sätze aus dem Tutorial

> How to Make and Remove Key Bindings 

> Here is an example of specifying that a component should react to the F2 key: 

> component.getActionMap().put("doSomething",  anAction);

> To add an entry to one of the maps, use the put method. You specify a key using a KeyStroke object, which you can get using the KeyStroke.getKeyStroke(String) method. You can find examples of creating an Action (to put in an action map) in How to Use Actions. 

in 'How to Use Actions'

> class LeftAction extends AbstractAction {


wie kommst du auf KeyListener oder ActionListener?
es zu versuchen ist ja sehr vorbildlich, 
aber wenn dir die Fehlermeldung sagt, dass eine Action erwartet wird und im Tutorial überall Actions erklärt werden,
dann ist das Vorgehen etwas haarsträubend,

also: Action verwenden, nicht KeyListener und auch nicht ActionListener

--------

> Aber natürlich kennt er doch action nicht, bevor der ActionListener aufgerufen wird?

korrekt, dieses Beispiel aus dem Forum scheint nicht so ideal, zumal mit ActionListener


----------



## cam (17. Nov 2008)

Alsoooo ich habe es geschafft *freu*.

Das mit dem ActionListener hatte ich in einem Beispiel aus dem Tutorial gefunden...

So sieht meine Lösung aus:


```
Action okAction = new AbstractAction () {
            @Override
            public void actionPerformed(ActionEvent arg0) {
            	start1.setVisible(false);
                mask2.setVisible(true);
            }
         };
        start1.setInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,start1.getInputMap());
        start1.getInputMap().put(KeyStroke.getKeyStroke("F1"), "okAction");
        start1.getActionMap().put("okAction", okAction);
```


----------

