JDialog mit ESC schliessen

Dox

Mitglied
Hallo alle zusammen,

habe ein kleines Problem mit dem schliessen des JDialog. Ich möchte mit ESC mein JDialog schliessen aber aus welchen Gründen auch immer klappt das nicht so, wie ich möchte. Wenn ich ESC oder ein andere Taste betätige passiert nichts. Ich hoffe es kann mir jemand bei der Problemlösung helfen.
Code:
import java.util.*;
import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import javax.swing.table.DefaultTableModel;
 

 public class ExceptionCalendar extends JDialog { 
 	
 	
 		public ExceptionCalendar()
 		{
 			OpenCalendar();
 		}
 		  
 		public void OpenCalendar()
 		{
 			
			this.addKeyListener(new KeyAdapter() 
					{
						public void keyPressed(KeyEvent event) 
						{
							if (event.getKeyCode()== KeyEvent.VK_ESCAPE) 
							{
								setVisible(false);
								dispose();							
							}
						}
					});
 			
 		  	
 			JPanel pan = new JPanel();
 		  	getContentPane().add(pan);
 		  	
 		  	final GregorianCalendar c = new GregorianCalendar();
 		    c.setTimeZone( TimeZone.getTimeZone("ECT") ); 

//============================================ JSpinner Year ======================================= 		    
 		    
 		    final Calendar standardWert = Calendar.getInstance();
 		    standardWert.add(Calendar.YEAR, 0);
 		    
		  	final Calendar von = Calendar.getInstance();
		  	von.add(Calendar.YEAR, -50);
		  	
		  	final Calendar bis = Calendar.getInstance();
		  	bis.add(Calendar.YEAR, 50);
		   
		  	final JSpinner spinner = new JSpinner(
		  			new SpinnerDateModel(standardWert.getTime(),von.getTime(),bis.getTime(),Calendar.YEAR));
		    spinner.setEditor(new javax.swing.JSpinner.DateEditor(spinner, "yyyy"));
 		    
//============================================ JComboBox Month ======================================= 
		    
		    String comedians[] = {
 		    		"January", "February" , "March", "April",
					"May", "June", "July", "August", "September", 
					"October", "November", "December" };
 		    
		    final JComboBox box = new JComboBox(comedians);
		    box.setSelectedIndex(c.get(Calendar.MONTH));
		    
//============================================ JTabel Calendar ======================================= 
		    
 		    final String title[] = new String[]{"Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday","Sunday"}; 
 		  	final String month[][] = calenderDate(c);
 		  	
 		  	
 		  	final DefaultTableModel data = new DefaultTableModel(month,title); 
 		  	
 		  	final JTable tabelCalendar = new JTable(data){
 		  		public boolean isCellEditable(int x, int y) 
 		  		{
 		  		return false;
 		  		}
 		  		};
 		  	tabelCalendar.setShowGrid(false);
 		  	tabelCalendar.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 		  	
 	
 		  	spinner.addChangeListener(new javax.swing.event.ChangeListener()
		            {
 		  				public void stateChanged(javax.swing.event.ChangeEvent e)
 		  				{
		                      int iYear = Integer.parseInt(spinner.getValue().toString().substring(24));
		                      c.set( Calendar.YEAR, iYear );
		                      data.setDataVector(calenderDate(c),title);
 		  				}
		            });
 		  	box.addActionListener(new ActionListener()
 					{
 		  				public void actionPerformed(ActionEvent e)	
 		  				{
 		  					
 		  					int i = box.getSelectedIndex();
 		  					c.set(Calendar.MONTH, i);
 		  					data.setDataVector(calenderDate(c),title);
 		  				}
 		  			});
 		  	
 		  	
//============================================ Input Components ====================================== 
 			pan.add(box);
 		  	pan.add(spinner);
 		  	pan.add(new JScrollPane(tabelCalendar));
 		  	
//================================== Set Location and Size of Dialog ================================== 
	  		
			setModal(true);
			setResizable(true);
			setLocation(278, 110);
			setSize(466, 238);
			setVisible(true);
		  }
 		  
 		  public String[][] calenderDate(Calendar c)
 		  {
 		  
			String[][] month = new String[6][7];
		    
			int mo = 0 ,tu = 0 ,we = 0, th = 0, fr = 0, sa = 0, su = 0;
			
			int dayDate = c.get(Calendar.DATE);
			
			for (int i = 1; i<=c.getActualMaximum(Calendar.DAY_OF_MONTH);i++){
				c.set( Calendar.DATE, i );
		    	
		    	int date = c.get(Calendar.DAY_OF_WEEK);
		    	int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
		    	
		    	if (date==2)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[mo][0]= new String().valueOf(c.get(Calendar.DATE));
		    		mo++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[mo][0]= "";
		    			mo++;
		    			
		    		}
		    		
		    		
		    	if (date==3)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[tu][1]= new String().valueOf(c.get(Calendar.DATE));
		    		tu++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[tu][0]= "";
		    			tu++;
		    		}
		    		
		    		
		    	if (date==4)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[we][2]= new String().valueOf(c.get(Calendar.DATE));
		    		we++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[we][0]= "";
		    			we++;
		    		}
		    		
		    	if (date==5)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[th][3]= new String().valueOf(c.get(Calendar.DATE));
		    		th++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[th][0]= "";
		    			th++;
		    		}
		    		
		    	if (date==6)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[fr][4]= new String().valueOf(c.get(Calendar.DATE));
		    		fr++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[fr][0]= "";
		    			fr++;
		    		}
		    		
		    	if (date==7)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[sa][5]= new String().valueOf(c.get(Calendar.DATE));
		    		sa++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[sa][0]= "";
		    			sa++;
		    		}
		    		
		    	if (date==1)
		    	{
		    		if(dayOfMonth == 1)
		    		{
		    			dayOfMonth = -1;
		    		}
		    		month[su][6] = new String().valueOf(c.get(Calendar.DATE));
		    		su++;
		    	}
		    	else 
		    		if(dayOfMonth == 1)
		    		{
		    			month[su][0]= "";
		    			su++;
		    		}
		    }
			c.set(c.DATE,dayDate);
			return month;
 		  }
 }

Gruß Willi
 
Hallo Dox,

probiere es mal damit:
Code:
final ActionListener listener = new ActionListener() {
    public final void actionPerformed(final ActionEvent e) {
        setVisible(false);
        dispose();
    }
};
final KeyStroke keyStroke =
    KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true);
registerKeyboardAction(listener, keyStroke,
        JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Diese Methodik mag zwar veraltet sein, funktioniert aber immernoch einwandfrei. ;)

Gruß
Vincent
 
Hi,

konnte mich etwas länger nicht mehr zu diesem Thema äußeren( andere Probleme hatten Vorrang ) aber Danke für Eure Hilfe. Leider habe ich es nicht geschaft das Problem aus der Welt zu schaffen :( .
Ich hoffe hier hat noch einer einen anderen Vorschlag.
 
also ich habe das gleiche Problem.

wenn ich den JDialog direkt den Keylistener zu ordne, dann werden keine Eingaben erkannt.

Das liegt aus meiner Sicht daran, das der Focus bei mir auf einer JList, in dem JDialog, liegt. Wenn ich nun den Keylistener auf die JList lege, geht es.

Nun mein problem, wenn aber der Focus auf eine ander Komponente geht, z.B. durch betätigen von Tap etc, dann funktioniert es nicht.
Eine Lösung wäre, allen Komponenten, auf die der Focus stehen könnte, mit einem Keylistener zu versehen. aber das ist eine sehr schlecht.

was kann man machen?

Danke
 
Hallo,

eigentlich habe ich bereits einen Lösungsansatz gepostet, aber anscheinend wurde es von manchen hier übersehen.

Hier ist eine Testklasse, die den Lösungsansatz anschaulicher macht:
Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;


public class DialogTest extends JDialog {
    
    public DialogTest(Frame owner, String title) {
        super(owner, title, true);
        
        final ActionListener listener = new ActionListener() {
            public final void actionPerformed(final ActionEvent e) {
                setVisible(false);
                dispose();
            }
        };
        final KeyStroke keyStroke =
            KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true);
        getRootPane().registerKeyboardAction(listener, keyStroke,
                JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        
        Container c = getContentPane();
        c.setLayout(new GridBagLayout());
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.fill = GridBagConstraints.BOTH;
        c.add(new JTextField(20), gbc);
        gbc.gridy = 1;
        c.add(new JTextField(20), gbc);
        gbc.gridy = 2;
        c.add(new JTextField(20), gbc);
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.VERTICAL;
        gbc.anchor = GridBagConstraints.EAST;
        c.add(new JButton("OK"), gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.CENTER;
        c.add(new JComboBox(), gbc);
        gbc.gridy = 1;
        c.add(new JComboBox(), gbc);
        gbc.gridy = 2;
        c.add(new JComboBox(), gbc);
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.VERTICAL;
        c.add(new JButton("Cancel"), gbc);
        
        pack();
        setLocationRelativeTo(owner);
        setVisible(true);
    }
    
    
    public static void main(String[] args) {
        final JFrame frame = new JFrame("DialogTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        Container c = frame.getContentPane();
        c.setLayout(new BorderLayout());
        
        JPanel buttonPanel = new JPanel();
        JButton button = new JButton("Show Dialog...");
        buttonPanel.add(button);
        c.add(buttonPanel, BorderLayout.SOUTH);
        
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new DialogTest(frame, "DialogTest");
            }
        });
        
        frame.setSize(400, 250);
        centerFrameOnScreen(frame);
        frame.setVisible(true);
    }
    
    public static final void centerFrameOnScreen(final JFrame frame) {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        
        frame.setLocation(screenSize.width / 2 - frameSize.width / 2, 
                screenSize.height / 2 - frameSize.height / 2);
    }
}
Das fettmarkierte Teil (das, was ich schon gepostet habe) ist hier eigentlich das Entscheidende. Der Rest des Codes ist nur eine Testumgebung.

Gruß
Vincent
 
Hi Vincentius,

ich danke Dir. Deine Beispiel hat mein Horizont um einiges erweitert. Ich hatte es wahrscheinlich beim ersten mal nicht richtig begriffen.

Ich hoffe das du Verständnis hast da ich erst seit 2 Monaten mich mit Java auseinandersetzt und vorher keine Programmierkenntnisse hatte.
 
Zurück