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:
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:
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: