mein Problem ist das der KeyListerner nicht zu funktionieren scheint. Also ich habe mir ein Beispielprogramm heruntergeladen dort öffnet sich ein Fenster welches man mit ESC schließen kann. Dann habe ich mein Programm dementsprechend erweitert durch implements KeyListener, den 3 Klassen keypressed, keyreleased und keyTyped, und natürlich addKeyListener(this) (das mit addKeyListener(this) habe ich dort stehen wo ich auch addWindowListener(this) stehen habe und das funktioniert). In der Klasse keypressed habe ich den Code stehen das das Program sich schließt wenn man auf ESC drückt (habe ich so aus dem Beispielprogramm übernommen).
Wenn ich das Programm dann kompiliere und starten will läuft alles ganz normal und wenn ich auf ESC drücke passiert gar nichts.
Mein Programm ist ein bisschen wie eine Website aufgebaut ich habe für jeden Frame eine eigene Klasse und meine Hauptplasse ist Index. Von dort aus starte ich das Hauptmenu wo ich den Keylistener Unterbringen will. In jeder Unterklasse also auch Hauptmenu habe ich stehen extends Index (also die Hauptklasse) liegt da vielleicht mein Problem?
Natürlich ich bin mir nur nicht sicher was relevant ist. Also das ist meine Hauptmenu Klasse
Code:
public class Hauptmenu extends XonaIndex implements ActionListener, WindowListener, KeyListener
{
public Hauptmenu()
{
setTitle("Xona: Hauptmenü");
add(new JLabel(new ImageIcon("images/hauptmenu.jpg")));
Button b1 = new Button("Kundenstamm");
b1.addActionListener(this);
b1.setActionCommand("kunde");
Button b2 = new Button("Artikelstamm");
b2.addActionListener(this);
b2.setActionCommand("artikel");
Button b3 = new Button("Auftrag");
b3.addActionListener(this);
b3.setActionCommand("auftrag");
Button b4 = new Button("Beenden");
b4.addActionListener(this);
add(b1);
add(b2);
add(b3);
add(b4);
addWindowListener(this);
setVisible(true);
addKeyListener(this);
}
public void actionPerformed (ActionEvent e)
{
String s = e.getActionCommand();
if (s.equals("kunde")) new Kunde();
if (s.equals("artikel")) new Artikel();
if (s.equals("auftrag")) new Auftrag();
if (s.equals("Beenden")) System.exit(0);
}
public void keyPressed(KeyEvent event)
{
if (event.getKeyCode() == KeyEvent.VK_ESCAPE)
{
setVisible(false);
dispose();
System.exit(0);
}
}
public void keyReleased(KeyEvent event) { }
public void keyTyped(KeyEvent event) { }
public void windowClosing (WindowEvent e)
{
dispose();
System.exit(0);
}
public void windowClosed (WindowEvent e) { }
public void windowOpened (WindowEvent e) { }
public void windowIconified (WindowEvent e) { }
public void windowDeiconified (WindowEvent e) { }
public void windowActivated (WindowEvent e) { }
public void windowDeactivated (WindowEvent e) { }
}
In der Hauptklasse XonaIndex steht extends Frame und solche sachen wie Farbe größe der Frames usw. Aber ich glaube die ist nicht so wichtig bei meinem Problem oder?
In der Klasse keypressed habe ich den Code stehen das das Program sich schließt wenn man auf ESC drückt (habe ich so aus dem Beispielprogramm übernommen).
Wenn ich das Programm dann kompiliere und starten will läuft alles ganz normal und wenn ich auf ESC drücke passiert gar nichts.
Erstmal danke für deine Antworten. So wie du mir das geschrieben hast funktioniert das leider auch nicht.
Ich bin ja kein Experte aber müsste das Programm nicht wenigstens einmal die Klasse keypressed durchlaufen wenn man auf eine Taste drückt? Ich habe nämlich jetzt ein System.out.print("test") mit reingeschrieben aber auf der Konsole erscheint gar nichts völlig egal welche Taste ich drücke. Das unten ist der Quellcode meiner Hauptklasse kann es was damit zu tun haben?
Code:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class XonaIndex extends Frame
{
FlowLayout myLayout = new FlowLayout();
public XonaIndex()
{
super();
setLayout(myLayout);
setSize(800,575);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
setLocation( (d.getSize().width - 800) / 2, (d.getSize().height - 575) / 2 );
setResizable(false);
setForeground(Color.black);
setBackground(Color.lightGray);
//setBackground(Color.decode("#ECE9D8"));
setFont(new Font("Arial", Font.PLAIN, 12));
}
public static void main (String args[])
{
new Hauptmenu();
}
}
Das Problem ist einfach das der Frame nicht den Focus hat, und deshalb auch keine KeyEvents bekommt.
mit
Code:
requestFocus();
kannst du das zwar erreichen, aber nur solange der Benutzer keiner anderen Komponente den Focus gibt.
Wenn du das unbedingt so haben möchtest müstest du wohl jeder komponente den KeyListener anhängen.
Empfehle dir übrings dringend den Umstieg auf Swing. Ist einfach besser!
danke für deine Antwort das werde ich gleich mal ausprobieren. Wie meinst du das mit dem Umstieg? Meinst du nur von AWT auf SWING, die ganze Programmierart oder das mit dem KeyListener?
mfg
Timo
Jetzt verstehe ich erst das Problem. Ich müsste dann also für jeder Komponenten einen KeyEvent programmieren das ist aber ganz schön umständlich. Wie wird das denn üblicherweise gemacht? Kann man sich die Programmierarbeit bei SWING sparen?
Eignetlich nur den Umstieg auf das Swing Paket, da es einfach mächtiger als AWT ist.
Zur Programmierung vieleicht noch ein Hinweis:
Gerade für Listener eignen sich Annonyme innere Klassen, also statt
Code:
public class Hauptmenu extends XonaIndex implements ActionListener, WindowListener, KeyListener
bspw. sowas:
Code:
public class Hauptmenu extends JFrame
{
public Hauptmenu()
{
//statt des Window-Listeners
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//und für Buttons etc. annonyme innere Klassen
JButton button = new JButton();
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
}
});
}
}
Dadurch wird die Kapselung besser, man braucht keine Actioncommands mehr usw.
Dr.Kolm hat gesagt.:
Jetzt verstehe ich erst das Problem. Ich müsste dann also für jeder Komponenten einen KeyEvent programmieren das ist aber ganz schön umständlich. Wie wird das denn üblicherweise gemacht? Kann man sich die Programmierarbeit bei SWING sparen?
Auch in Swing wird dir das nicht erspart bleiben. Du müsstest in deiner Klasse KeyListener implementieren und diese dann bei jeder eingefügten Komponente als KeyListener implementieren. Alternativ kannst du auch ein Superklasse erstellen, die die add() Methode überschreibt, und sich dabei automatisch
als Listener registriert.
Danke nochmal. Das mit dem überschreiben der add() Methode lasse ich mal lieber ist mein erstes GUI in Java.
Jetzt habe ich aber schon ein neues Problem und zwar will ich wenn ich in ein Textfeld bin eine Aktion ausführen wenn ich auf TAB drücke. Nur wenn ich in einem Textfeld auf TAB klicke geht der mal wieder nicht in die Keypressed Klasse. Wenn ich auf irgendeine andere Taste drücke klappt das nur bei TAB nicht. Kann mir vielleicht da auch noch jemand weiterhelfen?