Problem mit keyEvents
-
Hallo,
ich habe eine Applikation die aus eine GUI besteht und auf tastatur kombinationen reagieren soll.
beim drücken einer taste sollen Meldungen ausgegeben werden aber das passiert nicht.
bemerkung: wenn ich den GUI Teil kommentiere funktionieren die keyevents einwandfrei. ich entwickle unter eclipse 3.0.1 und verwende java 1.5.0_05hier der code:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.ScrollPaneConstants; public class KeyTest extends JFrame implements ActionListener, KeyListener { static private JLabel fehler_label = null; private JLabel logo_label = null; private JButton start_button = null; private JButton stop_button = null; private static JTextArea console = null; private static JButton console_loeschen_button = null; public static boolean debug = false; ImageIcon provikonLogo = null; /** * */ public KeyTest(String title) { super(title); addWindowListener(new ClosingWindowAdapter(this)); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); // wenn der GUI Teil kommentiert ist-> funktionieren die keyevents /****** GUI ANFANG **************/ provikonLogo = new ImageIcon("provikon-logo.jpg"); logo_label = new JLabel(provikonLogo); JPanel logoPane = new JPanel(); logoPane.setLayout(new FlowLayout()); logoPane.add(logo_label); fehler_label = new JLabel(" "); fehler_label.setForeground(Color.red); JPanel fehlerPane = new JPanel(); fehlerPane.setLayout(new FlowLayout()); fehlerPane.setBorder(BorderFactory .createTitledBorder("Fehlermeldungen")); fehlerPane.add(fehler_label); JPanel fehler_logo_pane = new JPanel(); fehler_logo_pane.setLayout(new GridLayout(0, 1)); fehler_logo_pane.add(logoPane); fehler_logo_pane.add(fehlerPane); start_button = new JButton("Kommunikation Starten"); start_button.addActionListener(this); stop_button = new JButton("Kommunikation Anhalten"); stop_button.setEnabled(false); stop_button.addActionListener(this); JPanel kommunikationPane = new JPanel(); kommunikationPane.setLayout(new FlowLayout()); kommunikationPane.setBorder(BorderFactory .createTitledBorder("Kommunikation")); kommunikationPane.add(start_button); kommunikationPane.add(stop_button); console_loeschen_button = new JButton("Console Loeschen"); console_loeschen_button.addActionListener(this); //console_loeschen_button.addKeyListener(this); console = new JTextArea("", 10, 30); console.setForeground(Color.BLUE); console.setEditable(false); JScrollPane scrollPane = new JScrollPane(console, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); JPanel consolePane = new JPanel(); consolePane.setBorder(BorderFactory.createTitledBorder("Console")); consolePane.setLayout(new BorderLayout()); consolePane.add(scrollPane, BorderLayout.NORTH); consolePane.add(console_loeschen_button, BorderLayout.EAST); JPanel gesamtPane = new JPanel(); gesamtPane.setLayout(new BorderLayout()); gesamtPane.add(fehler_logo_pane, BorderLayout.NORTH); gesamtPane.add(kommunikationPane, BorderLayout.CENTER); gesamtPane.add(consolePane, BorderLayout.SOUTH); Container contentPane = getContentPane(); contentPane.add(gesamtPane); /***** GUI ENDE ********/ //requestFocus(); addKeyListener(this);// registrieren in keylistener //contentPane.setFocusable(true); //enableEvents(AWTEvent.KEY_EVENT_MASK); } public static void main(String[] args) { KeyTest keytest = new KeyTest("Test der KeyEvents"); keytest.setVisible(true); keytest.setResizable(false); keytest.pack(); } public void keyPressed(KeyEvent ke) { System.out.println("in keyPressed"); //super.processKeyEvent(ke); } public void keyReleased(KeyEvent k) { System.out.println("in keyReleased"); } public void keyTyped(KeyEvent k) { System.out.println("in keyTyped"); } public void actionPerformed(ActionEvent e) { } } //Implementierung von WindowListener class ClosingWindowAdapter extends WindowAdapter { KeyTest keytest; String quittext = "möchten Sie den provikon-Webserver wirklich beenden ?"; public ClosingWindowAdapter(KeyTest keytest) { this.keytest = keytest; } public void windowClosing(WindowEvent e) { if (JOptionPane.showConfirmDialog(null, quittext, "provikon-Webserver", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { System.exit(0); } } }
hat jemand eine idee ?
danke im voraus.
-
Wenn eine andere Komponente des Panels den Fokus hat, kann man mit dem KeyListener für das Hauptfenster wohl keine Tastatureingaben abfangen. Das funktioniert erst wieder, wenn das Fenster den Fokus mittes requestFocus() erhält - allerdings erst nach Aufruf der setVisible()-Methode(!).
Eine Lösung wäre ein "Rundumschlag", in dem du allen Komponenten den Listener verpasst. Schau dir diesbezüglich das mal an: http://forum.java.sun.com/thread.jspa?threadID=588091