Mehrere JDialogs gleichzeitig offen

  • Themenstarter Themenstarter hey-ho
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

hey-ho

Gast
Hallo,

ich hab da ein kleines Problem, welches mir gerade bei meiner Swing-Anwendung aufgefallen ist. Und zwar habe ich einen JDialog, den ich aufrufe, um neue Daten einzugeben. Dies geschieht entweder durch mein Menü oder durch ein Tastenkürzel (STRG+N). Klappt auch so ganz gut. Nur ist mir gerade eben aufgefallen, dass ich durch das Tastenkürzel STRG+N den Dialog mehrmals aufrufen kann, d.h. die Dialoge liegen dann gleichzeitig mehrmals übereinander, je nachdem, wie oft ich die Tastenkombination gedrückt habe. Dann muss ich diese Dialoge erst wieder alle nacheinander schliessen. Wie kann ich so etwas denn vermeiden, da dies ziemlich störend und nicht so gewollt ist? Also, wenn ein Dialog geöffnet ist, soll die Tastenkombination STRG+N nicht funktionieren.

Vielen Dank schonmal
hey-ho
 
Der Dialog ist modal...
Der Menüpunkt ist ja auch deshalb nicht zu erreichen. Ich vermute mal, dass es an dem Code für das STRG+N liegt, welches in meiner HauptFrame-Klasse drin steht.

Code:
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class HauptFrame extends JFrame implements AWTEventListener {
	
	private HauptMenue hauptmenue;
	
	JPanel hauptPanel;
	
	KalenderDaten kalenderDaten;
	
	
	
	public HauptFrame() {
		
		setSize(500, 400);
		
		// Frame auf dem Bildschirm zentrieren
		setLocationRelativeTo(getParent());
		
		kalenderDaten = new KalenderDaten();
		
		
		hauptPanel = new JPanel();
		hauptPanel.setLayout(new BorderLayout());
		
		add(BorderLayout.CENTER, hauptPanel);
		
		hauptmenue = new HauptMenue(this, kalenderDaten);
		setJMenuBar(hauptmenue);
		
		Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);

		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		
	}
	
	
	
	public void eventDispatched(AWTEvent event) {
        if (event instanceof KeyEvent) {
            KeyEvent ke = (KeyEvent) event;
            if (ke.getKeyCode() == KeyEvent.VK_N && ke.isControlDown()) {
                new DialogNeuerTermin(this);
            }
        }
    } 
	

}
 
Danke für die schnelle Antwort. Das mit dem AWTEventListener ist mir hier im Forum empfohlen worden. Ich werde mir das mit den Key Bindings (InputMap/ActionMap) mal genauer anschauen...
 
Sorry, dass ich jetzt erst wieder schreibe, aber irgendwie komme ich mit den Key Bindings nicht so richtig weiter. Wo muss ich denn ActionMap/InputMap hinpacken, dass mein Programm auf die Tasteneingabe reagiert. Mein JFrame kann damit jedenfalls nichts anfangen.[/code]
 
Hallo,

ich denke, du musst sie an ein Panel hängen (oder eine andere Komponente, die von JComponent abgeleitet ist), also hauptPanel.getInputMap(...). Direkt beim JFrame gehts glaub ich nicht.
 
OK, ich hab das jetzt mal im Hauptframe an ein JPanel gehängt. Aber irgendwie klappt das noch nicht so richtig. Manchmal funktiniert es mit dem Tastenkürzel, aber manchmal passiert auch garnichts. Vielleicht könnt ihr euch das mal anschauen und mir Tipps geben, was ich falsch mache oder verbessern könnte.


Hier die Klasse mit dem Hauptframe:
Code:
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;


public class HauptFrame extends JFrame {
	
	private HauptMenue hauptmenue;
	
	JPanel hauptPanel;
		
	
	
	public HauptFrame() {

		setSize(500, 400);
		
		// Frame auf dem Bildschirm zentrieren
		setLocationRelativeTo(getParent());
				
		ActionAddTermin actionAddTermin = new ActionAddTermin(this);
		
		hauptPanel = new JPanel();
		hauptPanel.setLayout(new BorderLayout());
		
		add(BorderLayout.CENTER, hauptPanel);
		
		hauptmenue = new HauptMenue(this, kalenderDaten);
		setJMenuBar(hauptmenue);
	
		
		// Key Binding so richtig???
		
		KeyStroke neuerTermin = KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK, true);
		
		hauptPanel.getInputMap().put(neuerTermin, "test");
		
		hauptPanel.getActionMap().put("test", actionAddTermin);

		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		
	}
	

}


Und hier noch die Action-Klasse für einen neuen Termin (Dialog):
Code:
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;


public class ActionAddTermin extends AbstractAction {
	
	HauptFrame hauptframe;
	
	
	public ActionAddTermin(HauptFrame hauptframe) {
		
		this.hauptframe = hauptframe;
		
		
		putValue(Action.NAME, "neue Person...      STRG-N");
		putValue(Action.SHORT_DESCRIPTION, "neuen Termin eingeben");
		putValue(Action.MNEMONIC_KEY, new Integer('n'));
    }

    public void actionPerformed(ActionEvent event) {
    	new DialogNeuerTermin(hauptframe);
    	//hauptframe.kalenderDaten.addTermin();
    }
    
  
}

Vielen Dank schon mal für eure tolle Hilfe...
 
Du mußt dir vielleicht im oben verlinkten Tutorial die Sache mit dem Focus nochtmal ansehen. Hab mich jetzt auch nocht nicht konkret DAmit beschäftigt, aber ... wenn man z.B. ein TextField in den Frame legt, dann ist da ja immer der Cursor (d.h. auch der Focus) drin - und dann reagiert er nichtmehr. Bei einem Menu sieht man den Focus glaubich: Wenn man "ALT" drückt, wird geht der Focus ins Menu, und man sieht dann einen Rahmen um den Menünamen.

Aber mit
hauptPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(neuerTermin, "test");
könnte es schon gehen.
 
Hmmm, hatte das mit den verschiedenen Focus-Einstellungen mal durchprobiert - leider ohne Erfolg. Da ging dann plötzlich garnichts mehr. Aber ich habe gerade etwas festgestellt. Und zwar wird die Action nur dann auch ausgelöst, wenn die N-Taste wieder losgelassen wird. Und da ich ja eine Tastenkombination aus STRG und N gleichzeitig drücken muss, kommt es wohl manchmal dazu, dass evtl. die STRG-Taste vor der N-Taste losgelassen wird, was dann die Action nicht auslöst. Das heisst, es müsste die Action ausgelöst werden, wenn beide Tasten gedrückt werden, und nicht wenn die N-Taste losgelassen wird. Pffff, werde wohl noch weiter rumprobieren und suchen müssen...
 
Schau dir mal den letzten parameter von http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/KeyStroke.html#getKeyStroke(int,%20int,%20boolean) an....
 
Grrr, warum bin ich da nicht selbst draufgekommen. Vielen Dank, jetzt funktioniert es, so wie ich es wollte. Ich werde mir das mit den verschiedenen Focus-Einstellungen nochmal genauer anschauen. Im Moment hab ich garnichts angegeben. Wenn mein Dialog über das Tastenkürzel geöffnet wurde, dann passiert beim weiteren Drücken von STRG+N nichts, also es werden keine weiteren Dialoge geöffnet. Prima. Vielen Dank für die schnelle Hilfe...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben