Reihenfolge bei KeyListner

Status
Nicht offen für weitere Antworten.

Azrahel

Bekanntes Mitglied
Hallo Leute, ich hab da mal wieder ne Frage:

Also angenommen ich hab ein JTextField, und hänge da 2 KeyListener dran, kann ich dann irgendwie bestimmen welcher zuerst ausgeführt wird?

Konkret mein Textfeld:
Code:
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

import classes.globalfunctions.CharacterValidation;

/**
 * Diese Klasse erstellt ein benutzbares Datumsfeld. 
 * Dieses kann dann mit getField() in der Maske 
 * eingebaut werden. Zugriffe auf dieses Feld 
 * sollten nur mit den entsprechenden Methoden 
 * geschehen:
 * 
 * Einfügeoperationen 	 - insertString()
 * Löschoperationen   	 - removeString()
 * Ausgabeoperationen 	 - getDate(), getDate(String trenner)
 * Plausibilitätsprüfung - checkDate()
 * 
 */
public class DateField extends PlainDocument {
	private static final long serialVersionUID = -6020406856006419124L;
	private CharacterValidation cv = new CharacterValidation();
	private JTextField field=null;
	private boolean valid = false;
	private boolean changed = false;
	private FocusListener fl;
	private KeyListener kl;
	  
	  public DateField(KeyListener myKL) 
	  {
	    super();
		this.field = new JTextField(10);
		field.setDocument(this);
		field.addKeyListener(myKL);
		field.addFocusListener(getFl());
		field.addKeyListener(getValideListener());
		field.setFocusTraversalKeysEnabled(false);
		try {
			super.insertString(0, "  .  .    ", null);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		field.setCaretPosition(0);
	  }
	 
	  public void insertString(int offset, String  str, AttributeSet attr)throws BadLocationException{
	        if (str != null) {
	        	
	        	//Diese Methode sorgt dafür das das feld
	        	//immer beginnend mit dem ersten leerzeichen
	        	//von links an gefüllt wird
	        	for (int i=0;i<=10;i++){
	        		if(field.getText(i,1).equals(" ")){
	        			field.setCaretPosition(i);
	        			offset=i;
	        			break;
	        		}
	        	}
	        	char pkt = '.';
	        	char leer = ' ';
	        	str = str.replace(pkt,leer);
	        	str = str.replaceAll(" ","");
	        	
	        	if(field.getCaretPosition()==2){
					field.setCaretPosition(3);
					offset++;
				}
				
	        	if(field.getCaretPosition()==5){
					field.setCaretPosition(6);
					offset++;
				}
				
		        for (int i = 0; i < str.length(); i++)
				{
		       		 int einfuegestelle = offset + i;
					 char c = str.charAt(i);
					 if(cv.isNumeric(c))
			       	 {
			       	 	String ctos = Character.toString(c);
			       	 	if(einfuegestelle == 0 && Integer.parseInt(Character.toString(c))>=4)
			       	 		offset--;
			       	 	else if(einfuegestelle == 1 && (Integer.parseInt(field.getText(0,1))==3 && Integer.parseInt(Character.toString(c))>=2))
			       	 		offset--;
			       	 	else if(einfuegestelle == 3 && Integer.parseInt(Character.toString(c))>=2)
			       	 		offset--;
			       	 	else if(einfuegestelle == 4 && (Integer.parseInt(field.getText(3,1))==1 && Integer.parseInt(Character.toString(c))>=3))
			       	 		offset--;
		       	 		else if(einfuegestelle == 0 || einfuegestelle == 1 ||
			       	 	   einfuegestelle == 3 || einfuegestelle == 4 ||
						   einfuegestelle == 6 || einfuegestelle == 7 ||
						   einfuegestelle == 8 || einfuegestelle == 9)
			       	 	{
		       	 			super.insertString(einfuegestelle, ctos, attr);
			       	 		if(einfuegestelle != 2 && einfuegestelle != 5){
								super.remove(einfuegestelle+1,1);
							}
							setChanged(true);
		    		        setValid(false);
		    		        
		    		        if(field.getCaretPosition()==2){
		    					field.setCaretPosition(3);
		    					offset++;
		    				}
		    				
		    	        	if(field.getCaretPosition()==5){
		    					field.setCaretPosition(6);
		    					offset++;
		    				}
		    				
		    		        
			       	 	}
			       	 	else
			       	 		offset--;
			       	 }
				}
	        }
	  }

	public boolean checkDate() {
		String s=field.getText();
		int tag=Integer.parseInt(s.substring(0,2));
		int monat=Integer.parseInt(s.substring(3,5));
		int jahr=Integer.parseInt(s.substring(6,10));
		
		GregorianCalendar cal = new GregorianCalendar(jahr, monat-1, 1);
		if(monat<1 || monat>12 || tag<1 || tag>cal.getActualMaximum( Calendar.DAY_OF_MONTH)) {
   			JOptionPane.showMessageDialog(null, "Geben Sie ein korrektes Datum ein!", "Fehler", JOptionPane.ERROR_MESSAGE);
   			field.requestFocus();
   			field.selectAll();
			return false;
		}
		return true;
	}

	public void remove(int offs,int len)throws BadLocationException 
	{
		super.remove( offs, len);
		setChanged(true);
		setValid(false);
		int p = field.getCaretPosition();
		String s = field.getText();

    	char pkt = '.';
    	char leer = ' ';
    	s = s.replace(pkt,leer);
    	s = s.replaceAll(" ","");
		for(int i=0;i<10;i++){
			int j=i;
			if(i>=2)j--;		
			if(i>=5)j--;		
			if(i==2 || i==5){	
				super.insertString(i, ".", null);
			}else{
				if(s.length()<=j){
					super.insertString(i, " ", null);	
				}else{
					super.insertString(i, Character.toString(s.charAt(j)), null);
				}
			}
			if(field.getText(i+1,1)!=null && !field.getText(i+1,1).equals("") && !field.getText(i+1,1).equals("\n")){
				super.remove(i+1,1);
			}
			setChanged(true);
			setValid(false);
		}
		if(p==3 || p==6)p--;
		field.setCaretPosition(p);
	}
	
	
	/**
	 * Beim betreten das Feldes eingabe prüfen
	 */
	public KeyListener getValideListener() {
		kl = new KeyListener(){
			public void keyTyped(KeyEvent arg0) {;}
			public void keyPressed(KeyEvent arg0) {
				if(arg0.isShiftDown() && arg0.getKeyCode() == KeyEvent.VK_TAB){
					field.transferFocusBackward();
				}else{
					if(arg0.getKeyCode() == KeyEvent.VK_TAB || arg0.getKeyCode() == KeyEvent.VK_ENTER) {
						if(!checkDate()){
							field.requestFocus();
							field.selectAll();
						}else{
							field.transferFocus();
						}
					}
				}
			}
			public void keyReleased(KeyEvent arg0) {;}
		};
		return kl;
	}
	
	
	/**
	 * Beim betreten das Feldes alles Markieren
	 */
	public FocusListener getFl() {
		this.fl=new FocusListener(){

			public void focusGained(FocusEvent arg0) {
				field.selectAll();
			}

			public void focusLost(FocusEvent arg0) {
				;
			}
			
		};
		return fl;
	}
	
	/**
	 * gibt das Zeitfeld als grafische Komponente zurück.
	 */
	public JTextField getField(){
		return field;
	}
	
	/**
	 * gibt das Datum als integer zurück.
	 */
	public int getDate(){
		char pkt = '.';
    	char leer = ' ';
    	String help = field.getText().replace(pkt,leer);
    	String date=help.replaceAll(" ","");
		date=date.replaceAll(" ","");
		if(!date.equals("")){
			return Integer.parseInt(date);
		}else{
			return 0;
		}
	}
	
	/**
	 * gibt das Datum als String zurück.
	 */
	public String getDate(String trenner){
		char pkt = '.';
    	char leer = ' ';
    	String help = field.getText().replace(pkt,leer);
    	return help.replaceAll(" ",trenner);
	}
	
	/**
	 * gibt das Jahr als String zurück.
	 */
	public String getYear(){
    	return getDate("").substring(4,8);
	}
	
	/**
	 * gibt den Monat als String zurück.
	 */
	public String getMonth(){
    	return getDate("").substring(2,4);
	}
	
	/**
	 * 
	 */
	public void setDate(String date){
    	try {
			insertString(0,date, null);
		} catch (BadLocationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * gibt den Tag als String zurück.
	 */
	public String getDay(){
    	return getDate("").substring(0,2);
	}
	
	/**
	 * @return Returns the changed.
	 */
	public boolean isChanged() {
		return changed;
	}
	/**
	 * @param changed     The changed to set.
	 */
	public void setChanged(boolean changed) {
		this.changed = changed;
	}
	/**
	 * @return Returns the valid.
	 */
	public boolean isValid() {
		return valid;
	}
	/**
	 * @param valid     The valid to set.
	 */
	public void setValid(boolean valid) {
		this.valid = valid;
	}
}

Dieses Feld benutze ich dann in meinem Program, und dort hänge ich dann noch nen KeyListener an der guckt ob ich auch brav ein Datum eingetragen hab (ich brauchs ja nicht immer als Pflichtfeld, oder will per key noch andre nicht allgemein für ein Datumsfeld gültige Operationen ausführen). Nun hab ich aber das Problem das er den KeyListener in meinem Programm entweder gleichzeitig mit oder vor dem KeyListener in der Datumsfeldklasse ausführt. Kann ich da die Reihenfolge irgendwie beeinflussen ohne auf Treads zurückgreifen zu müssen?

Danke fürs Lesen und nachgrübeln schonmal vorab :)

Sollte sich heute keiner mehr melden macht euch keine Sorgen, ich hab dann erstmal 2 Wochen Urlaub :lol:
 

Wildcard

Top Contributor
Leroy42 hat gesagt.:
Das geht schon (durch überschreiben der entsprechenden notify Methode). Würde aber unbedingt davon abraten.
Überleg dir stattdessen eine sinvolle Art und Weise beides unter einen Hut zu bringen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Reihenfolge umkehren Allgemeine Java-Themen 6
E Fibonacci Reihenfolge dividieren Allgemeine Java-Themen 3
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
T datei auslesen ind der richtigen reihenfolge Allgemeine Java-Themen 2
J Beanshell Classpath Reihenfolge Allgemeine Java-Themen 2
J JSONObject Reihenfolge der Werte? Allgemeine Java-Themen 4
TheWhiteShadow Listener Reihenfolge Allgemeine Java-Themen 4
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
turmaline Reihenfolge von Parametern Allgemeine Java-Themen 7
F Multidimensionales Array ohne linare Reihenfolge! Allgemeine Java-Themen 8
C Reihenfolge einer SortedMap/TreeMap umkehren Allgemeine Java-Themen 3
N ArrayList nach Reihenfolge prüfen Allgemeine Java-Themen 2
C Netbeans - Aufruf-Reihenfolge Allgemeine Java-Themen 5
G Komische Reihenfolge mit dynamischem Proxy Allgemeine Java-Themen 9
Daniel_L Map/HashMap - Reihenfolge von Einträgen Allgemeine Java-Themen 4
L HashMap Key Reihenfolge umkehren Allgemeine Java-Themen 8
T Thread Reihenfolge Allgemeine Java-Themen 11
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
T HashMap#values Reihenfolge Allgemeine Java-Themen 13
G Buchstaben in umkekehrter Reihenfolge ausgeben Allgemeine Java-Themen 4
E Reihenfolge der Initialisierungen eines Objekts Allgemeine Java-Themen 17
V Reihenfolge ? Allgemeine Java-Themen 26
E Reihenfolge der Elemente einer ArrayList? Allgemeine Java-Themen 4
G ständig Iterator über Kollektion --> falsche Reihenfolge? Allgemeine Java-Themen 2
G Map oder List mit festgelegter Reihenfolge Allgemeine Java-Themen 4
T HashMap, sortiert nach Reihenfolge Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben