KeyEvents kommen nicht an

membersound

Bekanntes Mitglied
Hallo,

ich erstelle mir ein JOptionPane mit ja/nein. Die KeyListener Methode wird allerdings nie aufgerufen...
Warum werden meine KeyEvents nicht abgefangen?

Java:
deleteDialog = new javax.swing.JOptionPane();

deleteDialog.setMessage("Do you really want to delete this?");

deleteDialog.setOptionType(JOptionPane.YES_NO_OPTION);

deleteDialog.setOptions(new Object[]{"OK", "Cancel"});

deleteDialog.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyPressed(java.awt.event.KeyEvent evt) {
        deleteDialogKeyPressed(evt);
    }
});



    private void deleteDialogKeyPressed(java.awt.event.KeyEvent evt) {                                        
        System.out.println("any key pressed");
    }
 
Java:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class TestFrame extends JFrame{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -8669024322718970597L;

	public TestFrame(){
		setSize(400,400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		
		addKeyListener(new KeyAdapter() {
		    public void keyPressed(KeyEvent evt) {
		        System.out.println("Juhu");
		    }
		});
	}
	
	public static void main(String[] args) {
		new TestFrame();
	}
}

sollte so gehen
 
Naja ich möchte in dem erzeugen Dialog einfach auf Keyevents reagieren können. Enter sollen Dialog mit OK schließen, und ein anderer Button mit cancel. Dafür muss ich ja erstmal erreichen, dass er überhaupt auf KeyEvents in dem Dialog reagiert. Was er atm nicht tut.
 
Ich hatte jetzt den OptionPane einfach so ohne Frame erzeugt. Und lasse ihn mir an verschiedenen Stellen erzeugen zB mit
Java:
deleteDialog.createDialog("Confirm delete").setVisible(true);

Muss er in einen eigenen Frame rein, damit das funktioniert?
 
Zuletzt bearbeitet:
Muss er in einen eigenen Frame rein, damit das funktioniert?

Teste es selbst, wie es funktioniert. Im Grunde Du benutzt die Methode createDialog(String title) anstatt
createDialog(JDialog parentComponent, String title) - hier parentComponent=null. Für Test-Zwecken ist OK, in einem Projekt nicht. Ein Dialog soll immer (abgesehen von Haupt-Dialog wie JFrame Main) ein ParentComponent haben, damit es kurzfristig modal erscheint und gelöscht wird. Du will doch nicht dass ein Dialog irgendwo in einem Ebene steckt, oder?
 
Was ich nicht verstehe: Wenn ich mir einen JOptionPane mit .setOptionType(JOptionPane.YES_NO_OPTION); mache, dann ist meine Value davon entweder 0 oder 1, und wenn ich ENTER drücke wird immer der "Ja" Button, also 0, gedrückt. Also das ist die Standard-Behaviour. Selbst, wenn ich mit TAB auf den "nein" Button weiter gesprungen bin. Das macht doch gar keinen Sinn, dass ein YES_NO_OPTION bei Enter immer YES nimmt?

Wie kann ich auf dieses Verhalten denn nun Einfluss nehmen?

Wenn ich setOptions(new Object[]{"OK", "Cancel"}); mache, dann bekomme ich als Value natürlich OK/Cancel. Aber Enter wird nicht mehr entgegen genommen. Warum?
 
Ja kann schon sein. Ich frag mich dann nur, warum ich die beiden Optionen nicht einfach OK/Cancel benennen und mit den gleiche Key-Commands ansteuern kann.
 
... Ich frag mich dann nur, warum ich die beiden Optionen nicht einfach OK/Cancel benennen und mit den gleiche Key-Commands ansteuern kann.

JOptionPane ist eigentlich ein Dialog, man bau dort die Möglichkeit, nicht nur ein, nicht nur 2, sondern mehr Button-Optionen. Daher return value dieser Button ist int.
z.B. im folgendem Beispiel, wenn ich Parameter optionTyp die Werte JOptionPane.YES_NO_CANCEL_OPTION (=1!), dann hat Dialog 3 Button.
/*
public static final int YES_NO_OPTION = 0;
/** Type used for <code>showConfirmDialog</code>. */
public static final int YES_NO_CANCEL_OPTION = 1;
/** Type used for <code>showConfirmDialog</code>. */
public static final int OK_CANCEL_OPTION = 2;
*/
:lol:
Außerdem JOptionPane ist bereits Deine Anwendung, ohne irgendeine Bastelein anzuwenden.
Benuze einfach die Methode showConfirmDialog(....), oder showInputDialog(....), oder showInternalConfirmDialog( ....), oder showMessageDialog(...) oder showOptionDialog(...) für verschiedene Optionen-Dialog und bewertet die integer-return-values.
:lol:
Test-Code:
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Test extends JFrame implements ActionListener{
	private static final long serialVersionUID = 8115606456198930815L;
	public Test() throws HeadlessException {
		setTitle("Test_Frame");
		setMinimumSize(new Dimension(300, 200));
		setPreferredSize(new Dimension(600, 400));
		buttonTest = new JButton("Hier drücken um JOptionPane zu testen");
		getContentPane().add(buttonTest, BorderLayout.NORTH);
		
		textField = new JTextField();
		getContentPane().add(textField, BorderLayout.SOUTH);
		textField.setColumns(10);
		buttonTest.addActionListener(this);
	}
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				Test prg = new Test();
				prg.setVisible(true);
			}
		});
	}
	JButton buttonTest;
	private JTextField textField;
	private void startJOptionPane(){
//hier wartet man auf Button-Optionen:
		int choose=JOptionPane.showConfirmDialog(
			this, "Habt Ihr mich?", "Wähle Ja oder nein", JOptionPane.YES_NO_CANCEL_OPTION);
		if(choose==JOptionPane.OK_OPTION)
			textField.setText("Wähle OK");
		else if(choose==JOptionPane.NO_OPTION)
			textField.setText("Wähle NO");
		else
			textField.setText("Wähle Cancel");
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==buttonTest)
			startJOptionPane();
	}
}
 
Zuletzt bearbeitet:
Ja, klingt alles gut und logisch.

Aber ich möchte ja die Buttons selbst labeln!
Bzw kann man alternativ diese YES_NO_CANCEL_OPTIONen auf Englisch darstellen lassen?
Mein Tool ist halt rein EN, und wenn dann plötzlich ein Ja Nein Vielleicht Dialog kommt ist das nicht so prickelnd 😳
 
...
Bzw kann man alternativ diese YES_NO_CANCEL_OPTIONen auf Englisch darstellen lassen?
Mein Tool ist halt rein EN, und wenn dann plötzlich ein Ja Nein Vielleicht Dialog kommt ist das nicht so prickelnd 😳

Dein Programm läuft wahrscheinlich mit Locale.de. Bei meinem Test habe ich die Button auf Englisch gesehen, nicht Deutsch. Wenn es sein muß, setzt Locale temporär auf Locale.en beim Anzeigen von Dialog
 
Das schöne an java ist ja gerade dass es sich die default locale automatisch sucht. Wenn du also auf einem englischen Rechner dein Programm startest, ruft ein sauber programmiertes JOptionPane eine Yes No Cancel Option auf Englisch auf, nicht auf Deutsch.
 
Und was ist, wenn ich mein Programm mit verschiedene Sprachen ausrüsten will, und der User auf einem englischen Rechner zB deutsche Oberfläche auswählt? Dann bekäme er diese Dialoge ja trotzdem mit Yes, No, Cancel angezeigt.
 
Und was ist, wenn ich mein Programm mit verschiedene Sprachen ausrüsten will, und der User auf einem englischen Rechner zB deutsche Oberfläche auswählt? Dann bekäme er diese Dialoge ja trotzdem mit Yes, No, Cancel angezeigt.

Du gibt Deine Vermutung ab, ohne zu kontrollieren. Die zeigen immer entsprechende Sprache zu gewählten Locale, was Du temporär verändern kann!
:rtfm:
Wenn Du die vorhandene nicht benutzen will, dann versuche die Source von JOptionPane nachzuforschen und gegenbenfalls manche Methoden in UI überschreiben.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben