Der KeyListener Löst kein event aus

Fridolin111

Mitglied
Ich sitze gerade an einer Gui und versuche verzweifelt einen KeyListener hinzukrigen.
Aber aus irgendeinem grund wird das event nicht ausgelöst.
Weiß jemand warum?
(Ich habe den KeyListener in Zeile 201 definiert)

[CODE lang="java" title="Gui"]package de.gui;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import de.datamanagment.Categorys;
import de.datamanagment.DatamanagmentSaves;
import de.datamanagment.Entry;
import de.main.Main;
import de.sqlite.SQLiteManager;

public class Gui extends JFrame implements KeyListener {
private static final long serialVersionUID = -4066404451884471989L;

public static boolean GuiIsOpen = false;
// private JFrame frame = new JFrame();
private JLabel topLayer = new JLabel();
@SuppressWarnings("rawtypes")
private JList list1 = new JList();
@SuppressWarnings("rawtypes")
private DefaultListModel list1Model = new DefaultListModel();
private JScrollPane list1ScrollPane = new JScrollPane(list1);
private JScrollBar ScrolBar = new JScrollBar();
private JLabel lName = new JLabel();
private JLabel lTyp = new JLabel();
@SuppressWarnings("rawtypes")
private JList list2 = new JList();
@SuppressWarnings("rawtypes")
private DefaultListModel list2Model = new DefaultListModel();
private JScrollPane list2ScrollPane = new JScrollPane(list2);
private JButton deletEntry = new JButton();
private JButton openEntry = new JButton();
private JLabel lAusgewaehltenEintrag = new JLabel();
private JButton rename = new JButton();
private JButton newCategory = new JButton();
private JButton newEntry = new JButton();
// Ende Attribute

@SuppressWarnings("unchecked")
public Gui() {
super();
System.out.println();
if (!GuiIsOpen) {
GuiIsOpen = true;

Main.newPaswort = null;
Main.login = null;
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 700;
int frameHeight = 500;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("Passwortmanager");
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten

topLayer.setBounds(225, 8, 250, 25);
topLayer.setText("Passwortmanager");
topLayer.setFont(new Font("Dialog", Font.BOLD, 20));
topLayer.setHorizontalAlignment(SwingConstants.CENTER);
cp.add(topLayer);
cp.setBackground(Color.WHITE);
setUndecorated(false);
list1.setModel(list1Model);
list1ScrollPane.setBounds(30, 70, 278, 370);
// list1Model.addElement("1");
// list1Model.addElement("2");
// list1Model.addElement("3");
// list1Model.addElement("4");
cp.add(list1ScrollPane);
ScrolBar.setBounds(8, 58, 17, 380);
ScrolBar.setOrientation(SwingConstants.VERTICAL);
cp.add(ScrolBar);
lName.setBounds(32, 50, 42, 19);
lName.setText("Name");
cp.add(lName);
lTyp.setBounds(312, 50, 49, 19);
lTyp.setText("Typ");
cp.add(lTyp);
list2.setModel(list2Model);
list2ScrollPane.setBounds(312, 72, 121, 369);
cp.add(list2ScrollPane);
deletEntry.setBounds(440, 72, 242, 33);
deletEntry.setText("... löschen (entf)");
deletEntry.setMargin(new Insets(2, 2, 2, 2));
deletEntry.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
deletEntry(evt);
}
});
cp.add(deletEntry);
openEntry.setBounds(440, 112, 242, 33);
openEntry.setText("... öffnen (enter)");
openEntry.setMargin(new Insets(2, 2, 2, 2));
openEntry.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
opoenEntry(evt);
}
});
cp.add(openEntry);
lAusgewaehltenEintrag.setBounds(440, 48, 242, 19);
lAusgewaehltenEintrag.setText("Ausgewählten Eintrag...");
cp.add(lAusgewaehltenEintrag);
rename.setBounds(440, 152, 242, 33);
rename.setText("... umbenenen (u)");
rename.setMargin(new Insets(2, 2, 2, 2));
rename.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
renameEntry(evt);
}
});
cp.add(rename);

newEntry.setBounds(440, 232, 242, 33);
newEntry.setText("Neuer Eintrag");
newEntry.setMargin(new Insets(2, 2, 2, 2));
newEntry.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {

}
});
cp.add(newEntry);

newCategory.setBounds(440, 272, 242, 33);
newCategory.setText("Neue Kategory");
newCategory.setMargin(new Insets(2, 2, 2, 2));
newCategory.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {

}
});
cp.add(newCategory);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
windos_closed(evt);
}
});

ScrolBar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent evt) {

}

});

list1.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
list2.setSelectedIndex(list1.getSelectedIndex());
}
});

list2.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
list1.setSelectedIndex(list2.getSelectedIndex());
}
});

for (Entry ent : DatamanagmentSaves.entrys) {
list1Model.addElement(ent.website);
list2Model.addElement("Eintrag");
}
for (Categorys cat : DatamanagmentSaves.categorys) {
System.out.println(cat.catName);
if (cat.getMother() != null && cat.getMother().catName.equals("main")) {
list1Model.addElement(cat.catName);
list2Model.addElement("Category");
}
}

this.addKeyListener(new MyKeyListener());
setVisible(true);
}

}

public void windos_closed(WindowEvent evt) {
System.out.println("closed");
SQLiteManager.disconnect();
System.exit(0);
}

public void deletEntry(ActionEvent evt) {

}

public void opoenEntry(ActionEvent evt) {

}

public void renameEntry(ActionEvent evt) {

}

@Override
public void keyTyped(KeyEvent evt) {
System.out.println("key");
}

@Override
public void keyPressed(KeyEvent evt) {
int key = evt.getKeyCode();
System.out.println(key);
}

@Override
public void keyReleased(KeyEvent evt) {
// TODO Auto-generated method stub

}

}

class MyKeyListener extends KeyAdapter {

public void keyPressed(KeyEvent event) {
System.out.println("asdf");

}

}
[/CODE]
 
Das Problem ist vermutlich, das der KeyListener auf dem JFrame nur auslöst wenn der Frame selber und nicht irgendeins der Elemente auf dem JFrame den Fokus hat.
 
Es gibt viele Möglichkeiten.
a) Man kann einen Listener bei mehreren Elementen eintragen. Dann wäre es egal, welches Element den Listener hat. So könntest Du z.B. durch alle Elemente durchgehen um dann den Listener hinzu zu fügen.
b) Du kann einen Listener global eintragen - das gilt dann aber für die ganze Applikation, also auch bei mehreren Fenstern und so. Aber wenn die Aktion immer gleich ist, ist das natürlich eine elegante Lösung:
Java:
        KeyboardFocusManager.getCurrentKeyboardFocusManager()
                .addKeyEventDispatcher(e -> {
                        // Whatever ...
                    });
Dabei aber auch KeyEventDispatcher beachten: https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/KeyEventDispatcher.html Die Methode gibt ein boolean zurück, die bestimmt, ob weitere Aktionen stattfinden sollen oder nicht.

Das wären so direkt zwei Möglichkeiten, die mir einfallen würden...
 
Ja, du hast ja als Parameter (in meinem Beispiel das e vom Lambda Ausdruck) ein KeyEvent

Und da wird das auch beschrieben - so solltest Du 3 Event bekommen:
KEY_PRESSED
KEY_TYPED (is only generated if a valid Unicode character could be generated.)
KEY_RELEASED

Und ich meine über getId() kannst Du prüfen, ob es ein KeyEvent.KEY_PRESSED Event ist.
 

Neue Themen


Zurück
Oben