Swing KeyListener in JTextfield

M

MSchneider

Gast
Hallo,


ich habe folgendes Problem:
Ich habe eine Klasse von JFormattedTextField abgeleitet welche ein Textfield zur Eingabe eines Datums bereitstellen soll, soweit funktioniert es auch. Aber neben der direkten Eingabe des Datums soll durch Drücken von + und - das im Feld aktuell enthaltene Datum um ein Tag erhöht bzw. verringert werden.

Meine Code ist der folgender:
Java:
public class MyDateField extends JFormattedTextField implements KeyListener
{
  public MyDateField()
  {
    super(
      new DateFormatter( DateFormat.getDateInstance (DateFormat.SHORT, Locale.GERMAN))
    );
    addKeyListener(this);
  }

  public void keyTyped(KeyEvent e)
  {
    if (e.getKeyChar()=='+')
    {
      try
      {
//        e.consume();
        Date date = new Date();   // für den Fall das das Feld leer ist, wird das aktuelle Datum genommen
        if (! this.getText().equals(""))
        {
          date = (Date) getFormatter().stringToValue(this.getText());
        }

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, 1);
        date = cal.getTime();
        
        this.setText(getFormatter().valueToString(date));
        System.out.println(date.toLocaleString());
      }
      catch(ParseException e1)
      {
        // ...
      }
    }
    else if (e.getKeyChar()=='-')
    {
       // analog zu '+'
    }
  }
  public void keyPressed(KeyEvent e) {}
  public void keyReleased(KeyEvent e) {}
}

Das Problem ist nun folgendes:
Wenn ich + drücke, wird das Datum korrekt berechnet und in das Textfeld geschrieben, aber das Zeichen + wird noch hinten angehängt, was nicht erwünscht ist.
Ich hab irgendwo gelesen das man das mit "e.consume()" unterbinden kann. Wenn ich aber die auskommentierte Zeile mit e.consume()" im Code aktiviere, wird zwar das Datum richtig berechnet aber nicht in das Textfeld geschrieben. Wahrscheinlich weil mit dem consume() die weitere Eventbearbeitung inkl. des Textfeldupdates abgebrochen wird.

Hat jemand eine Idee wie man das Problem lösen kann?

Danke im Voraus.
 
Zuletzt bearbeitet von einem Moderator:
M

MSchneider

Gast
Ich hab es mit dem JSpinner mit DateModel probiert. Allerdings scheint das nicht das Problem zu lösen. Ich kann dann zwar mit der Maus über die Spin-Buttons das Datum erhöhen bzw. verringern, aber bei der gewünschten Steuerung über Tastatur mit + und - scheint es die gleichen Probleme, wie schon oben erwähnt, zu geben. Da die Dialoge wo das Textfeld zum Einsatz kommen soll, hauptsächlich mit der Tastatur bedient werden wird, liegt das Hauptaugenmerk auf die Steuerung per Tastatur. Insofern sind die Spin-Buttons und die Steuerung über Maus eher optionales Gimmik aber nicht die Lösung des Problems.

Trotzdem Danke für den Vorschlag.
 

tagedieb

Top Contributor
Wenn du JFormattedTextField verwendest musst du auch die entsprechenden Methoden benutzen getValue() / setValue(). Du brauchst das Datum ja nicht selber formatieren sonst erweiterst du ja bloss ein JTextField und erfindest das Rad nochmal neu ;-)

Mit dem e.consume() hat schon alles richtig funktioniert. Du hast lediglich das Datum falsch berechnet. Spricht du hast dem Calendar nicht das Date aus dem TextField uebergeben sonden immer eine neue Instanz mit dem heutigen Datum verwenden. Als ergebnis zeigt er natuerlich immer das morgige Datum.


Java:
  public void keyTyped(KeyEvent e) {
    if (e.getKeyChar() == '+') {
      Date date = (Date) getValue();
      if (date == null) {
        date = new Date(); // für den Fall das das Feld leer ist, wird das
                           // aktuelle Datum genommen
      }

      Calendar cal = Calendar.getInstance();
      cal.setTime(date);
      cal.add(Calendar.DATE, 1);
      date = cal.getTime();

      setValue(date);
      System.out.println(date.toLocaleString());
      e.consume();
    } else if (e.getKeyChar() == '-') {
      // analog zu '+'
    }
  }
 
M

MSchneider

Gast
Danke, tagedieb! Das hat das Problem gelöst.

Falls es jemand intressiert, hier der Code des keyTyped-Handlers (noch etwas umgebaut):
Java:
  public void keyTyped(KeyEvent e)
  {
    if ((e.getKeyChar()=='+')||(e.getKeyChar()=='-')){
      Date date = (Date) getValue();
      if (date == null)
      {
        date = new Date();
      }
      Calendar cal = Calendar.getInstance();
      cal.setTime(date);
      if (e.getKeyChar()=='+')
      {
        cal.add(Calendar.DATE, 1);
      }
      else
      {
        cal.add(Calendar.DATE, -1);
      }
      date = cal.getTime();
      
      this.setValue(date);
      e.consume();
    }
  }

Das Problem ist damit gelöst. (Kann das Thema leider nicht auf erledigt setzen)

Nochmals Danke.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
G JFrame,JPanel,JTextField und KeyListener AWT, Swing, JavaFX & SWT 6
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G KeyListener AWT, Swing, JavaFX & SWT 3
E KeyListener AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben