Eingaben abfangen

Hallo!
Ich hatte letztes Mal das Problem, dass ich in KeyPressed die Eingabe überprüft habe, und falls diese ungültig sein sollte, hab ich die Methode consume() benutzt. (Sozusagen alle NichtZahlen rausgefiltert)
Das funktionierte aber nur, wenn ich TextField und nicht JTextField verwendet habe.
Um auch JTextField benutzen zu können, bekam ich den Tipp, das ganze in keyTyped reinzupacken:

public void keyTyped(KeyEvent e) {
char key = e.getKeyChar();
if (!Character.isDigit(key)) {
e.consume();
}
}

Allerdings möchte ich auch die Taste entf und backspace erlauben. Dafür habe ich die Methode getKeyCode() verwendet, um diese Tasten auch zu erlauben:

public void keyTyped(KeyEvent e) {
char key = e.getKeyChar();
if (!Character.isDigit(key) && e.getKeyCode != 109) {
e.consume();
}
}

Jetzt hab ich aber gemerkt, dass getKeyCode() in der Methode KeyTyped immer nur den Wert 0 liefert. Hat jemand von euch eine Idee, wie man dieses Problem umgehen kann?
Kleine Frage noch am Rande, kann man die Liniendicke bzw. Farbe vom Separator ändern und wenn ja wie?

Vielen Dank für eine Antwort
Manfred

Hallo!
Jetzt hab ich aber gemerkt, dass getKeyCode() in der Methode
KeyTyped immer nur den Wert 0 liefert. Hat jemand von euch
eine Idee, wie man dieses Problem umgehen kann?

Okay, dann pack das ganze in keyReleased(KeyEvent). Das sollte es
dann gewesen sein. :smile:

Kleine Frage noch am Rande, kann man die Liniendicke bzw.
Farbe vom Separator ändern und wenn ja wie?

Ist mir nicht bekannt. Falls das tatsaechlich nicht gehen sollte,
dann koenntest du dir ueberlegen einfach ein Rechteck zu zeichnen.
Da kannst du Breite und Hoehe selbst bestimmen. Sieht aber nicht
so schoen wie ein Separator aus.
Eine weitere Alternative ist setBorder() der Komponenten, um
Bloecke von anderen sichtbar zu trennen. (panel.setBorder(…))
http://java.sun.com/docs/books/tutorial/uiswing/misc…
Da hast du dann aber einen ganzen Rahmen um die Gruppe.
Gruss, Patrick

JSeparator-Eigenschaften ändern
Hallo Manfred.

kann man die Liniendicke bzw. Farbe vom Separator
ändern und wenn ja wie?

Die Liniendicke kannst Du nicht ändern, der Separator
malt sich immer mit 2 Linien, die jeweils einen Pixel
dick sind.

Bei einem horizontalen JSeparator wird die
obere der beiden Linien in der Farbe gemalt, die
separator.getForeground() zurückgibt und die untere
Linie mit der Farbe, die separator.getBackground()
liefert.

Die Standardfarben des JSeparators lassen sich auch
für Deine ganze Anwendung global über die beiden
Eigenschaften „Separator.background“ und „Separator.foreground“
ändern.

Code-Schnippsel dazu:

// auskommentieren, um Standardfarben für die ganze Anwendung
// zu ändern
//UIManager.put("Separator.background", Color.BLACK);
//UIManager.put("Separator.foreground", Color.MAGENTA);

// horizontaler Trenner:
JSeparator separator = new JSeparator(JSeparator.HORIZONTAL);

// Farbe der oberen Linie ändern:
separator.setForeground(Color.RED);
// Farbe der unteren Linie:
separator.setBackground(Color.BLACK);

Um das alles herauszufinden, muss man allerdings direkt
einen Blick in den Java-Quellcode werfen, was uns die Firma Sun ja
freundlicherweise erlaubt:
http://developer.classpath.org/doc/javax/swing/plaf/…

Gruß,
-Andreas.

Danke für die Antwort!
Leider musste ich aber festellen, wenn ich das ganze in keyReleased reinpacke, dass dann wieder alle Zeichen durchkommen, genauso wie bei keyPressed. Gibt es noch eine andere Möglichkeit, womit man nur Zahlen und die backspace und entf-Tasten erlauben kann?
Vielen Dank für eine Antwort
Gruß
Manfred

keyReleased reinpacke, dass dann wieder alle Zeichen
durchkommen, genauso wie bei keyPressed. Gibt es noch eine

Oha, shame on me.
Wenn du diesen Code in keyReleased() und keyTyped() reinpackst,
dann sollte es gehen.

char key = e.getKeyChar();
if (!Character.isDigit(key) 
 && (e.getKeyChar() != KeyEvent.VK\_BACK\_SPACE)) {
 e.consume();
} 

Die [Entf]-Taste (VK_DELETE) brauchst du nicht extra abfragen,
da die ohnehin funktioniert. Sagt zumindest mein Test.

Gruss, Patrick

Hallo Manfred.

Ich hatte letztes Mal das Problem, dass ich in KeyPressed die
Eingabe überprüft habe, und falls diese ungültig sein sollte,
hab ich die Methode consume() benutzt. (Sozusagen alle
NichtZahlen rausgefiltert)

Allerdings möchte ich auch die Taste entf und backspace
erlauben.

Hmm, wenn ich den folgenden Code ausführe, und in
keyTyped alle Nicht-Zahlen ignoriere, kann ich das
JTextField trotzdem mit entf und Backspace editieren:

JTextField tfNumber = new JTextField();
tfNumber.addKeyListener(new NumberFilterKeyListener());

class NumberFilterKeyListener implements KeyListener {
 public void keyTyped(KeyEvent e) {
 // ACHTUNG: in keyTyped darf nur nach key character gefragt werden:
 char typedKeyChar = e.getKeyChar();
 if (!Character.isDigit(typedKeyChar)) {
 System.out.println("IGNORE non-digit!");
 e.consume();
 } 
 }
 public void keyPressed(KeyEvent e) {
 // ACHTUNG: in keyPressed und keyReleased 
 // darf nur nach dem key code gefragt werden:
 int typedKeyCode = e.getKeyCode();
 if (typedKeyCode == KeyEvent.VK\_BACK\_SPACE) {
 System.out.println("FOUND BACKSPACE!");
 } 
 }
 public void keyReleased(KeyEvent e) {}
}

Dafür habe ich die Methode getKeyCode() verwendet,
um diese Tasten auch zu erlauben:

public void keyTyped(KeyEvent e) {
char key = e.getKeyChar();
if (!Character.isDigit(key) && e.getKeyCode != 109) {
e.consume();
}
}

Jetzt hab ich aber gemerkt, dass getKeyCode() in der Methode
KeyTyped immer nur den Wert 0 liefert.

Das hast Du richtig erkannt, es wird nämlich zwischen
den beiden Low-Level-Ereignissen keyPressed/keyReleased
und dem High-Level-Ereignis keyTyped unterschieden.

Bsp.
Das High-Level-Zeichen ‚A‘ ergibt sich aus den
beiden Low-Level-Tastaturereignissen
‚Shift‘-pressed + ‚A‘-pressed

Deshalb darfst Du innerhalb von keyTyped() nur nach
dem Key-Character (=char) fragen, in keyPressed() und keyReleased()
dagegen nur nach dem Key-Code (=int, der mit den VK_*-Konstanten
verglichen werden kann).

Details unter
http://java.sun.com/docs/books/tutorial/uiswing/even…

Gruß,
-Andreas.

Hallo, danke für die Antworten.
Ich hab den Quelltext in ein Programm eingebaut, allerdings mekert der Compiler, dass er „NumberFilterKeyListener()“ nicht kennen würde. Hab ich irgendetwas vergessen zu importieren oder sonst irgendetwas falsch gemacht?

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class eingabe extends JDialog implements WindowListener, KeyListener
{
/**
* Konstruktor für Objekte der Klasse ein
*/
public eingabe(JFrame frm)
{

super(frm,„Hallo“, true);
addWindowListener(this);
getContentPane().setLayout(new GridLayout(0,1));

JPanel über = new JPanel();
JPanel eingab = new JPanel();

JTextField tfNumber = new JTextField();
tfNumber.addKeyListener(new NumberFilterKeyListener());

JLabel überschrift = new JLabel(„Bitte geben Sie etwas ein“);
über.add(überschrift);
eingab.add(eing);

getContentPane().add(über);
getContentPane().add(eingab);
}

public void windowActivated(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowOpened(WindowEvent e){}

public void windowClosing(WindowEvent e)
{
System.exit(0);
}

public void keyTyped(KeyEvent e)
{
// ACHTUNG: in keyTyped darf nur nach key character gefragt werden:
char typedKeyChar = e.getKeyChar();
if (!Character.isDigit(typedKeyChar))
{
System.out.println(„IGNORE non-digit!“);
e.consume();
}
}
public void keyPressed(KeyEvent e)
{
// ACHTUNG: in keyPressed und keyReleased
// darf nur nach dem key code gefragt werden:
int typedKeyCode = e.getKeyCode();
if (typedKeyCode == KeyEvent.VK_BACK_SPACE)
{
System.out.println(„FOUND BACKSPACE!“);
}
}

public void keyReleased(KeyEvent e)
{}

}
Vielen Dank
Manfred

mekert der Compiler, dass er „NumberFilterKeyListener()“ nicht
kennen würde. Hab ich irgendetwas vergessen zu importieren
oder sonst irgendetwas falsch gemacht?

Andreas hat den KeyListener in einer (internen) Klasse implementiert.

class NumberFilterKeyListener implements KeyListener {...

Da du das offensichtlich nicht 1 zu 1 uebernommen hast und deine
Haupt-Klasse den KeyListener implementiert, muss du this uebergeben.

tfNumber.addKeyListener(this);

Im uebrigen funktioniert mit dem Code die Backspace-Taste bei mir
nicht. Erst folgende Aenderung in keyTyped hat bei mir Erfolg
gebracht:

 if (!Character.isDigit(typedKeyChar)
 && (typedKeyChar != '\b')) {

Gruss, Patrick

Hallo Patrick,

Im uebrigen funktioniert mit dem Code die Backspace-Taste bei
mir nicht.

Das ist interessant, da es bei mir ohne Probleme funktioniert.
Was gibt denn Dein Java aus, wenn Du es mit den folgenden Zeilen fütterst?

System.out.println("Java " + System.getProperty("java.version") + " von " + System.getProperty("java.vendor"));
System.out.println("mit " + System.getProperty("java.vm.name") + " " + System.getProperty("java.vm.version"));
System.out.println("auf " + System.getProperty("os.name") + " v" + System.getProperty("os.version") + " (" + System.getProperty("os.arch") + ")");

Bei mir wäre das:

Java 1.5.0\_07 von Sun Microsystems Inc.
mit Java HotSpot(TM) Client VM 1.5.0\_07-b03
auf Windows XP v5.1 (x86)

Gruß,
-Andreas.

Hi Andreas,

Java 1.4.2\_10 von Sun Microsystems Inc.
mit Java HotSpot(TM) Client VM 1.4.2\_10-b03
auf Windows XP v5.1 (x86)

Mag daran liegen.

Gruss, Patrick