Swing JTextField - vorausgefüllt bei klick leer

Status
Nicht offen für weitere Antworten.

Andreas1989

Aktives Mitglied
Hallo,
ich wollte fragen obs eine Funktion gibt, die einen Standardtext in ein JTextField setzt und nur diesen beim anklicken des JTextFields wieder löscht. So wie das Bild im Anhang.
Bis jetzt habe ich halt dem textField nen Listener gegeben der auf beim anklicken auf den Standardtext überprüft. Wenn der Standardtext noch da ist, mach ich einfach .setText("");

Gruß
Andreas
 
Zuletzt bearbeitet von einem Moderator:

Hadernlump

Mitglied
Ich hätte es genau wie du gelöst, es handelt sich dabei meines Wissens um keine Funktionalität, die das Standard-JTextField besitzt. Warum behältst du nicht die Lösung mit dem Listener bei, gibt es damit irgendwelche Probleme?
 

Andreas1989

Aktives Mitglied
Danke erstmal.
Also hatte bis jetzt damit auch keine Probleme. Wollte nur mal wissen obs schon irgendwas vordefiniertes gibt.

Gruß
Andreas
 

objcler

Aktives Mitglied
Hallo,

also ich bin ein absoluter Java-Neuling aber ich kann mir kaum vorstellen, dass die von Andreas geschilderte Lösung im Javaumfeld als toll angesehen wird. Sie mag vielleicht funktionieren aber meiner Meinung nach eher suboptimal.

Wäre es nicht besser die geforderte Funktionalität in einem JTextField-Subclass zu realisieren? Man könnte der neuen Klasse eine neue Eigenschaft "placeholderString" verpassen. Ist der Wert von placeholderString ungleich Null, so wird der Wert von placeholderString als Text im Textfeld angezeigt. Der Text könnte, um deutlich zu machen, dass es nur ein "Platzhalter" ist statt schwarz in grau dargestellt werden. Dann würde auch die von Andreas vorgeschlagene Überprüfung, ob der "Standardtext" noch da ist wegfallen.

Der Platzhalter wird angezeigt, falls er definiert wurde und getText() keinen leeren String liefert. Sonst nicht.

Was haltet ihr davon? Macht doch Sinn - oder?
 
G

Gast2

Gast
und wenn er reinklickt braucht er trotzdem einen Listener um den text zu löschen oder auch nicht...
 

objcler

Aktives Mitglied
und wenn er reinklickt braucht er trotzdem einen Listener um den text zu löschen oder auch nicht...

Geht ja nicht um den Listener sondern

1. um die Funktionalität, dass der Platzhalter in grau und nicht in schwarz erscheint
2. und dass der Platzhalter eine Eigenschaft des Textfeldes ist
3. und dass so das Vergleichen wegfällt, ob der aktuelle Text == Platzhalter
 
G

Gast2

Gast
Geht ja nicht um den Listener sondern

1. um die Funktionalität, dass der Platzhalter in grau und nicht in schwarz erscheint
2. und dass der Platzhalter eine Eigenschaft des Textfeldes ist
3. und dass so das Vergleichen wegfällt, ob der aktuelle Text == Platzhalter

Zu 1. und 2. kommt immer drauf an wieivel Textfelder er davon braucht, wegen einem würde ich nicht gleich eine eigene Klasse schreiben, aber prinzipiell is die Idee eigene Textfelder zu machen nicht schlecht...
zu 3. Irgendwann muss er überprüfen...
 

objcler

Aktives Mitglied
Zu 1. und 2. kommt immer drauf an wieivel Textfelder er davon braucht, wegen einem würde ich nicht gleich eine eigene Klasse schreiben, aber prinzipiell is die Idee eigene Textfelder zu machen nicht schlecht...
zu 3. Irgendwann muss er überprüfen...

Klar muss er was prüfen. Hat er ein TextField-Subclass mit einer Eigenschaft "placeholder" muss er nur prüfen, ob der placeholder ungleich Null ist und ob der aktuelle Text ungleich Null ist. Es müssen folglich keine Strings verglichen werden.

Anders beim Vorschlag von Andreas. Falls ich ihn richtig verstanden habe will immer den aktuellen Wert von getText() auswerten. Ist getText() != dem "Standardwert", dann passiert nichts. Was aber passiert, wenn der Standardwert auf "Vorname" gesetzt ist und der Benutzer in das Textfeld klickt und "Vorname" eingibt? Soll dann "Vorname" im Falle des Falles gespeichert werden, obwohl es gleich dem Platzhalter ist? Das ist doch alles etwas unklar und verwirrend.

Daher benötigt man in jedem Fall eine weitere Eigenschaft. Standardwert und aktueller Inhalt eines Textfeldes in eine einzige Eigenschaft zu packen (text) ist einfach nur frickelig.
 
G

Gast2

Gast
Klar muss er was prüfen. Hat er ein TextField-Subclass mit einer Eigenschaft "placeholder" muss er nur prüfen, ob der placeholder ungleich Null ist und ob der aktuelle Text ungleich Null ist. Es müssen folglich keine Strings verglichen werden.

Anders beim Vorschlag von Andreas. Falls ich ihn richtig verstanden habe will immer den aktuellen Wert von getText() auswerten. Ist getText() != dem "Standardwert", dann passiert nichts. Was aber passiert, wenn der Standardwert auf "Vorname" gesetzt ist und der Benutzer in das Textfeld klickt und "Vorname" eingibt? Soll dann "Vorname" im Falle des Falles gespeichert werden, obwohl es gleich dem Platzhalter ist? Das ist doch alles etwas unklar und verwirrend.

Daher benötigt man in jedem Fall eine weitere Eigenschaft. Standardwert und aktueller Inhalt eines Textfeldes in eine einzige Eigenschaft zu packen (text) ist einfach nur frickelig.

mach am besten ein bsp. kann mir nicht vorstellen wie du das machen willst
 
G

Gast2

Gast
[HIGHLIGHT="Java"]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class CTextField extends JTextField implements FocusListener {

public final static int DEFAULT_LIMIT = 1000;
private final static Color FOCUS_BACKGROUND_COLOR = new Color(224, 254, 173);
private final static Color INATIVE_BACKGROUND_COLOR = UIManager.getColor("TextField.inactiveBackground");
private final static Color INATIVE_FORGROUND_COLOR = UIManager.getColor("TextField.inactiveForeground");
private final static Color BACKGROUND_COLOR = UIManager.getColor("TextField.background");
private final static Color FORGROUND_COLOR = UIManager.getColor("TextField.forground");

private String texttip;
private int limit;

private TextDocument document;

public CTextField() {
this("", 0, DEFAULT_LIMIT);
}

public CTextField(int columns) {
this("", columns, DEFAULT_LIMIT);
}

public CTextField(String text) {
this(text, 0, DEFAULT_LIMIT);
}

public CTextField(String text, int columns) {
this(text, columns, DEFAULT_LIMIT);
}

public CTextField(String text, int columns, int limit) {
super(text, columns);
this.limit = limit;
// listener for the insert values
document = new TextDocument();
setDocument(document);
setText(text);
addFocusListener(this);
setColumns(columns);
}

public void focusGained(FocusEvent e) {
setBackground(FOCUS_BACKGROUND_COLOR);
setForeground(FORGROUND_COLOR);
if (super.getText().equals(texttip)) {
setText("");
}
checkBackgroundColor();
}

public void focusLost(FocusEvent e) {
setBackground(BACKGROUND_COLOR);

checkBackgroundColor();
if (getText().length() <= 0) {
setTexttip(texttip);
}

}

private void checkBackgroundColor() {
if (!isEnabled())
setBackground(getDisabledTextColor());
if (!isEditable())
setBackground(INATIVE_BACKGROUND_COLOR);
}

public void setTexttip(String texttip) {
this.texttip = texttip;
if (getText().length() <= 0) {
setText(texttip);
setForeground(INATIVE_FORGROUND_COLOR);
}
}

public String getexttip() {
return texttip;
}

public class TextDocument extends PlainDocument {

public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException {
try {
// check the limit
if (getText(0, this.getLength()).length() >= limit || s.length() > limit) {
throw new NumberFormatException();
}
} catch (NumberFormatException ex) {
Toolkit.getDefaultToolkit().beep(); // macht ein beep
return;
}
super.insertString(offset, s, attributeSet);
}
}

@Override
public String getText() {
return super.getText().equals(texttip)? "" : super.getText();
}

public static void main(String[] args) {
JFrame frame = new JFrame();
final CTextField c = new CTextField();
final CTextField d = new CTextField("Horst");
d.setTexttip("Bitte name eingeben");
c.setTexttip("Test");
frame.setBackground(new Color(238, 238, 238));
frame.add(c, BorderLayout.CENTER);
frame.add(d, BorderLayout.NORTH);
JButton button = new JButton("Toggle");
button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
c.setEditable(!c.isEditable());
d.setEnabled(!d.isEnabled());
}

});
frame.add(button, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);
}

}


[/HIGHLIGHT]

Hier hab ich vor langer Zeit mal sowas gemacht. Wie gesagt das Problem ist wenn der texttip genau gleich wie das eingebene ist da müsstest noch was einbauen...
Ansonsten kannst halt ein Limit für das Textfeld noch angeben.
Und du musst selber definieren was passiert wenn du setEnable und setEditable aufrufst text anzeigen oder nicht...
 

Ebenius

Top Contributor
Viel schöner ist es, wenn das Dokument davon unberührt bliebe. Das Dokument als Model der Textkomponente ist ja eigentlich leer, auch wenn der Hinweis in der Komponente angezeigt wird. Ganz ohne Listener kommt diese Klasse daher und zeichnet den Hinweis in einem Highlighter.

[Highlight=Java]/* (@)JHintingTextField.java */

/* Copyright 2009 Sebastian Haufe

* Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

* Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

package com.ebenius.widget;

import java.awt.*;

import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.Highlighter.HighlightPainter;

/**
* An enhanced text field, showing an {@link #getEmptyTextHint() empty text}
* hint on its view, if the {@link #getText() text content} is empty.
*
* @version $Revision: 1.1 $ as of $Date: 2009/04/08 19:13:04 $
* @author Sebastian Haufe
*/
public class JHintingTextField extends JTextField {

/** Serial version UID */
private static final long serialVersionUID = 5061790840224877676L;

// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------

/**
* Creates a new <code>JHintingTextField</code>.
*/
public JHintingTextField() {
installHighlightPainter();
}

/**
* Creates a new <code>JHintingTextField</code>.
*
* @param columns the number of preferred columns to calculate preferred
* width
*/
public JHintingTextField(int columns) {
super(columns);
installHighlightPainter();
}

/**
* Creates a new <code>JHintingTextField</code>.
*
* @param text the text to show in the text field
*/
public JHintingTextField(String text) {
super(text);
installHighlightPainter();
}

/**
* Creates a new <code>JHintingTextField</code>.
*
* @param text the text to show in the text field
* @param columns the number of preferred columns to calculate preferred
* width
*/
public JHintingTextField(String text, int columns) {
super(text, columns);
installHighlightPainter();
}

/**
* Creates a new <code>JHintingTextField</code>.
*
* @param doc the text model
* @param text the text to show in the text field
* @param columns the number of preferred columns to calculate preferred
* width
*/
public JHintingTextField(Document doc, String text, int columns) {
super(doc, text, columns);
installHighlightPainter();
}

// -------------------------------------------------------------------------
// Hinting highlighter code
// -------------------------------------------------------------------------

private void installHighlightPainter() {
Highlighter highlighter = getHighlighter();
System.out.println(highlighter);
try {
highlighter.addHighlight(0, 0, createHighlightPainter());
} catch (BadLocationException ex) {
assert false : "0:0 illegal?"; //$NON-NLS-1$
}
}

protected HighlightPainter createHighlightPainter() {
return new Highlighter.HighlightPainter() {

final JLabel label = new JLabel("", //$NON-NLS-1$
SwingConstants.TRAILING);
final int gap = 3;

public void paint(
Graphics g,
int p0,
int p1,
Shape bounds,
JTextComponent c) {
final String hint = (String) c.getClientProperty( //
"emptyTextHint"); //$NON-NLS-1$
if (hint == null
|| hint.length() == 0
|| c.getDocument().getLength() != 0) {
return;
}
label.setText(hint);

final Insets ins = c.getInsets();
final boolean ltr = c.getComponentOrientation().isLeftToRight();
if (ltr) {
ins.right += gap;
} else {
ins.left += gap;
}

final Dimension pref = label.getPreferredSize();
final int prHeight = pref.height;
final int prWidth = pref.width;
final int w = Math.min(c.getWidth() - ins.left - ins.right, prWidth);
final int h = Math.min(c.getWidth() - ins.top - ins.bottom, prHeight);
final int x = ltr ? c.getWidth() - ins.right - w : ins.left;
final int parentHeight = c.getHeight() - ins.top - ins.bottom;
final int y = ins.top + (parentHeight - h) / 2;
label.setForeground(Color.GRAY);
label.setOpaque(false);
SwingUtilities.paintComponent(g, label, c, x, y, w, h);
}
};
}

// -------------------------------------------------------------------------
// Bean getters and setters
// -------------------------------------------------------------------------

/**
* Returns the emptyTextHint.
*
* @return the emptyTextHint
*/
public String getEmptyTextHint() {
return (String) getClientProperty("emptyTextHint"); //$NON-NLS-1$
}

/**
* Sets the emptyTextHint.
*
* @param hint the emptyTextHint to set
*/
public void setEmptyTextHint(String hint) {
putClientProperty("emptyTextHint", hint); //$NON-NLS-1$
repaint();
}
}[/Highlight]

Zu testen mit diesem Code: [Highlight=Java]public static void main(String[] args) {
final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
final JHintingTextField comp = new JHintingTextField(20);
comp.putClientProperty("emptyTextHint", "Name, Vorname");
contentPane.add(comp);
contentPane.add(new JButton("Dummy"), BorderLayout.LINE_END);

final JFrame f = new JFrame("Test Frame: JHintingTextField");
f.setContentPane(contentPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}[/Highlight]
Ebenius
 
Zuletzt bearbeitet:
G

Gast2

Gast
Schöne Lösung wieder was gelernt gefällt mir....
Würde das "emptyTextHint" als public final static machen...
Mal ne Frage wie kommt man auf sowas??Gibts ne Seite was man so alles mit den Textfelder anstellen kann...
z.B.
1.wenn das Textfeld den Focus hat --> Farbe ändern
Geht das auch ohne Listener
2.Oder ein Limit setzen-->hab ich immer im Document geprüft, was ich eigentlich ok fand da das Model ist...
 

Ebenius

Top Contributor
Schöne Lösung wieder was gelernt gefällt mir....
Hört man gern.

Würde das "emptyTextHint" als public final static machen...
Das halte ich für unnötig. Der Name der Eigenschaft ist durch die Java-Bean-Spec klar (getter und setter heißen ja so). Da orientiere ich mich einfach an Sun-Code; die machen das (seit längerem) auch inline.

Mal ne Frage wie kommt man auf sowas??Gibts ne Seite was man so alles mit den Textfelder anstellen kann...
Sicher gibt's irgendwo was. Der Highlighter ist sicher im Sun Tutorial erwähnt. Ich bin aber anders rangegangen: Hab mir überlegt wo's hingehört (View) und mir dann eine Stelle in JTextField gesucht, die dazu passt. Dieser Ansatz funktioniert (zumindest für mich) bei Swing unheimlich oft. :)

1.wenn das Textfeld den Focus hat --> Farbe ändern
Geht das auch ohne Listener
Eher nicht. Du kannst natürlich ein UI-Delegate basteln, was das tut. Das würde letztendlich aber auch wieder einen Listener setzen. Oder Du überschreibst processFocusEvent(FocusEvent e) in Deiner JTextField-Ableitung und reagierst dort. Dazu muss enableEvents(AWTEvent.FOCUS_EVENT_MASK) aktiviert werden; auch wenn das Flag für das JTextField ohnehin durch das UI aktiviert wird, weil ja der Cursor gezeichnet wird. Du könntest auch dafür einen Highlighter benutzen, aber das würde ich für Missbrauch (und vergleichsweise schwierig umsetzbar) halten.

2.Oder ein Limit setzen-->hab ich immer im Document geprüft, was ich eigentlich ok fand da das Model ist...
Gehört ins Modell. Allerdings ist ein DocumentFilter am Dokument wohl die bessere weil leichtgewichtigere und flexiblere Wahl. Im Sun Java™ Tutorial: Text Component Features / Abschnitt: Implementing a Document Filter ist sogar genau das Beispiel beschrieben.

Gute Nacht,
Ebenius
 
G

Gast2

Gast
Das halte ich für unnötig. Der Name der Eigenschaft ist durch die Java-Bean-Spec klar (getter und setter heißen ja so). Da orientiere ich mich einfach an Sun-Code; die machen das (seit längerem) auch inline.
Ok alles klar!


Eher nicht. Du kannst natürlich ein UI-Delegate basteln, was das tut. Das würde letztendlich aber auch wieder einen Listener setzen. Oder Du überschreibst processFocusEvent(FocusEvent e) in Deiner JTextField-Ableitung und reagierst dort. Dazu muss enableEvents(AWTEvent.FOCUS_EVENT_MASK) aktiviert werden; auch wenn das Flag für das JTextField ohnehin durch das UI aktiviert wird, weil ja der Cursor gezeichnet wird. Du könntest auch dafür einen Highlighter benutzen, aber das würde ich für Missbrauch (und vergleichsweise schwierig umsetzbar) halten.
mhm dann musst halt selber unterscheiden ob focus lost oder focus gained aufgerufen wurde.


Gehört ins Modell. Allerdings ist ein DocumentFilter am Dokument wohl die bessere weil leichtgewichtigere und flexiblere Wahl. Im Sun Java™ Tutorial: Text Component Features / Abschnitt: Implementing a Document Filter ist sogar genau das Beispiel beschrieben.
Verstehe grad nicht den Vorteil von den Filter wie oben siehst hab ich dafür immer das PlainDocument benutzt. Der Filter macht nichts anderes oder?
 

Ebenius

Top Contributor
mhm dann musst halt selber unterscheiden ob focus lost oder focus gained aufgerufen wurde.
Was ja trivial ist: [Java]if (e.getID() == FocusEvent.FOCUS_GAINED) {
...
}[/Java]

Verstehe grad nicht den Vorteil von den Filter wie oben siehst hab ich dafür immer das PlainDocument benutzt. Der Filter macht nichts anderes oder?
Der Vorteil ist, dass Du den Filter nur an das Dokument anhängst. Den selben Filter (instanzgleich) kannst Du an mehrere Dokumente (AbstractDocument) hängen, ohne die Dokumente selbst verändern zu müssen. Der selbe Filter (selbe Klasse) funktioniert ggf. auch bei einem DefaultStyledDocument (oder anderen), was die Wiederverwendbarkeit erhöht.

Ebenius
 
G

Gast2

Gast
Was ja trivial ist: [Java]if (e.getID() == FocusEvent.FOCUS_GAINED) {
...
}[/Java]
Klar ist es trivial ... aber macht ja kein unterschied ob man da dann eine FocusListener registriert oder die methode überschreibt oder?

Der Vorteil ist, dass Du den Filter nur an das Dokument anhängst. Den selben Filter (instanzgleich) kannst Du an mehrere Dokumente (AbstractDocument) hängen, ohne die Dokumente selbst verändern zu müssen. Der selbe Filter (selbe Klasse) funktioniert ggf. auch bei einem DefaultStyledDocument (oder anderen), was die Wiederverwendbarkeit erhöht.

Ok sollte ich mal beachten hab bis jetzt solche prüfungen immer in den Documenten gemacht...
 

Ebenius

Top Contributor
Klar ist es trivial ... aber macht ja kein unterschied ob man da dann eine FocusListener registriert oder die methode überschreibt oder?
Jain. Ich mache nie nen Listener aufs eigene Objekt, wenn ich das verhindern kann. Ist irgendwie schizophren, sich als Auditorium seiner selbst zu betrachten. ;)

Ebenius
 

Ebenius

Top Contributor
Ich meine damit sowohl:
Java:
this.addXYZListener(this);
... als auch:
Java:
this.addXYZListener(new XYZListener() {
  public void xyzHappened(XYZEvent e) {
    // code here
  }
}
Letzteres Konstrukt schleppt schließlich auch die this-Referenz mit in den Zuhörer.

Ebenius
 
G

Gast2

Gast
Ich meine damit sowohl:
Java:
this.addXYZListener(this);
... als auch:
Java:
this.addXYZListener(new XYZListener() {
  public void xyzHappened(XYZEvent e) {
    // code here
  }
}
Letzteres Konstrukt schleppt schließlich auch die this-Referenz mit in den Zuhörer.

Ebenius
ja ok so meinte ich es ;)...

Ok dann hab ich mal ne Frage zu den Filter.
Mal angenommen es soll ein Textfeld enstehen das nur double werte einlesen kann und dann richtig darstellt (. und , trennung)...
so dann lass ich dass in meinem filter parsen und überprüfe ob es ein double ist und wie lass ich es dann richtig darstellen???z.B. wie setz ich die CaretPosition neu usw.
wie würdest sowas machen???
Hab ich bis jetzt alles ins PlainDocument(innere Klasse) gemacht...
 

Ebenius

Top Contributor
Sowas würde ich gar nicht mit einem JTextField machen. Dafür gibt's doch das JFormattedTextField. Und wenn Du das entsprechend anpassen möchtest, dann hast Du darin einen Formatter hängen in dem Du ganz problemlos nachimplementieren kannst wonach auch immer Dir ist.

Ebenius
 

Ebenius

Top Contributor
Du kannst ein Datumsformat nicht in dem Sinne während der Eingabe prüfen. Die Eingabe besteht jeweils aus einem Zeichen. Du müsstest das ganze Dokument bei jedem insert und auch remove gegen das Format prüfen. Dafür könntest Du natürlich keinen einfachen Filter nehmen, sondern müsstest das Dokument anpassen. Das ist aber allgemein unheimlich unhöflich. Der Nutzer kann dann immer nur von links nach rechts eingeben, aber nicht mehr vernünftig im Feld editieren.

Ebenius
 
G

Gast2

Gast
Du kannst ein Datumsformat nicht in dem Sinne während der Eingabe prüfen. Die Eingabe besteht jeweils aus einem Zeichen. Du müsstest das ganze Dokument bei jedem insert und auch remove gegen das Format prüfen. Dafür könntest Du natürlich keinen einfachen Filter nehmen, sondern müsstest das Dokument anpassen. Das ist aber allgemein unheimlich unhöflich. Der Nutzer kann dann immer nur von links nach rechts eingeben, aber nicht mehr vernünftig im Feld editieren.

Ebenius

Nee seh ich nicht so...
 
G

Gast2

Gast
Beispiel
[HIGHLIGHT="Java"]

public class JDoubleField extends JTextField {

protected NumberFormat format = NumberFormat.getInstance(Locale.getDefault());
private boolean negative;
private int limit ;

public JDoubleField() {
super();
setDocument(new DoubleDocument());
limit = 10;
negative = true;
}

public void setNegative(boolean negative) {
this.negative = negative;
}

public boolean isNegative() {
return negative;
}

@Override
protected void processFocusEvent(FocusEvent e) {
super.processFocusEvent(e);
if(e.getID() == FocusEvent.FOCUS_LOST)
{
try {
setText(format.format(format.parse(getText())));
} catch (ParseException e1) {
}
}
}


public class DoubleDocument extends PlainDocument {

public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException {
try {
if (getText(0, this.getLength()).length() >= limit || s.length() > limit) {
throw new ParseException(s, offset);
}
if (s.length() > 1) {
String foString = format.format(format.parse(s));
super.insertString(offset, foString, attributeSet);
setCaretPosition(getText().length());
} else {
if (negative && offset == 0 && s.equals("-")) {

if (getLength() <= 0) {
super.insertString(offset, s, attributeSet);
return;
} else {
StringBuilder builder = new StringBuilder();
builder.append(s);
builder.append(getText());
format.parse(builder.toString());
super.insertString(offset, s, attributeSet);
}

}
if (!s.equals(".") && !s.equals(",") && !s.equals("0")) {
format.parse(s);
super.insertString(offset, s, attributeSet);
String text = getText();
int pos = text.length();
remove(0, getLength());
super.insertString(0, format.format(format.parse(text)), attributeSet);
text = getText();
if (pos <= text.length()) {
if (pos % text.length() == 0) {
setCaretPosition(offset + s.length());
} else {
setCaretPosition(offset + s.length() + 1);
}
}
} else {
super.insertString(offset, s, attributeSet);
}
}
} catch (ParseException e) {
Toolkit.getDefaultToolkit().beep();
}
}

private String getText() throws BadLocationException {
return getText(0, getLength());
}
}

public static void main(String[] args) {
JFrame frame = new JFrame();
final JDoubleField i = new JDoubleField();
final JDoubleField d = new JDoubleField();
d.setText("123213");
frame.add(i, BorderLayout.CENTER);
frame.add(d, BorderLayout.EAST);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);
}

}
[/HIGHLIGHT]
 

Ebenius

Top Contributor
setCaretPosition() aus dem Modell finde ich schlecht. Ein Modell sollte immer mit mehreren Instanzen einer Komponente arbeiten können. Diese Regel verletzt Du dadurch (auch durch das format). Für das setzen der Cursor-Position ist die Komponente (oder deren UI-Delegate) zuständig. Auf keinen Fall das Modell.

Bei remove prüft Dein Modell gar nicht. Damit kann ich also die legale Eingabe "-e" erzeugen ("-1e4 eingeben und "1" und "4" löschen). Die Validierung bei FOCUS_LOST ist in einem InputVerifier besser aufgehoben. Und für den ganzen Anwendungsfall ein JFormattedTextField (welches einem auch immer den validen Wert als Wert geben kann) zu benutzen finde ich
  1. wesentlich einfacher, weil schon fertig,
  2. wesentlich übersichtlicher, weil nicht zigfache unübersichtliche String-Operationen zu einem intuitiv nicht greifbaren Ergebnis führen
  3. sicherer, weil die Komponenten natürlich besser getestet sind als selbst erstellte, und
  4. deutlich angenehmer zu benutzen, weil ich als Nutzer eben auch darin herumeditieren kann.
Wenn ich den Code in einem Projekt finden würde das ich übernehmen soll, würde ich ihn kurz durchlesen, feststellen, dass er nicht mal eben greifbar ist und dann ausbauen. :)

Ebenius
 

Ebenius

Top Contributor
Damit kann ich also die legale Eingabe "-e" erzeugen ("-1e4 eingeben und "1" und "4" löschen).
Achnee, das prüft Dein Modell ja auch noch explizit. Also wissenschaftliche Zahlendarstellung geht dann mal nicht. Was, wenn Du das doch ermöglichen willst? Was, wenn das Standard-Zahlenformat die wissenschaftliche Darstellung ermöglicht? Dann fliegst Du auf die Nase, weil ich meine Java-Maschine anders konfiguriert habe. Was, wenn mein Standardzahlenformat das Minuszeichen mit Leerzeichen getrennt von der Zahl akzeptiert und so formatiert? Was, wenn in meinem System das Minus hinter der Zahl steht? Was, wenn ich weder Punkt noch Komma als Dezimaltrenner benutze? Was, wenn ich Tausendertrennzeichen in meinem System benutze?

Willst Du Dich um all diese Fragen selbst kümmern müssen? Ich schreibe Software, die in Asien, Amerika und Europa eingesetzt wird. Keine Ahnung, was die Japaner unter ner Standard-Darstellung einer Zahl verstehen. Und ich will mich darum auch nicht kümmern müssen.

Ebenius
 

Ebenius

Top Contributor
[SIZE="-2"]Der dritte Post hintereinander, sorry. Aber editieren will ich hier nicht.[/SIZE]

Ist nicht alles was Du brauchst das da?
Java:
final NumberFormatter nf = new NumberFormatter();
nf.setAllowsInvalid(false);
final JFormattedTextField ftf = new JFormattedTextField(nf);

Ebenius
 
G

Gast2

Gast
wart ich versuch mal

EDIT:
Ja sieht nicht schlecht aus...
1.aber ich bekomm das textfeld nie mehr leer...
2. gibts das auch für decimal ??
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Hier mal ein paar kleine Beispiele:
Java:
@SuppressWarnings("boxing")
public static void main(String[] args) {
  final JPanel contentPane = new JPanel(new GridLayout(0, 1));
  {
    final NumberFormatter nf =
          new NumberFormatter(NumberFormat.getInstance());
    nf.setAllowsInvalid(false);
    final JFormattedTextField ftf = new JFormattedTextField(nf);
    ftf.setColumns(10);
    ftf.setValue(0.1);
    contentPane.add(ftf);
  }
  {
    final NumberFormatter nf =
          new NumberFormatter(NumberFormat.getCurrencyInstance());
    nf.setAllowsInvalid(false);
    final JFormattedTextField ftf = new JFormattedTextField(nf);
    ftf.setColumns(10);
    ftf.setValue(0.1);
    contentPane.add(ftf);
  }
  {
    final NumberFormatter nf =
          new NumberFormatter(NumberFormat.getPercentInstance());
    nf.setAllowsInvalid(false);
    final JFormattedTextField ftf = new JFormattedTextField(nf);
    ftf.setColumns(10);
    ftf.setValue(0.1);
    contentPane.add(ftf);
  }

  final JFrame f = new JFrame("Test Frame: JFormattedTextFields");
  f.setContentPane(contentPane);
  f.pack();
  f.setLocationRelativeTo(null);
  f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  f.setVisible(true);
}
Um das TextField leer zu machen, schreibst Du Dir einen eigenen Formatter, der null unterstützt. In etwa:
Java:
new NumberFormatter(NumberFormat.getInstance()) {

  @Override
  public Object stringToValue(String text) throws ParseException {
    return text.trim().length() == 0 ? null : super
          .stringToValue(text);
  }

  @Override
  public String valueToString(Object value) throws ParseException {
    return value == null ? "" : super.valueToString(value);
  }
};
2. gibts das auch für decimal ??
Keine Ahnung was Du damit meinst.

Das Sun Java™ Tutorial: How to Use Formatted Text Fields ist gar nicht übel.

Ebenius
 
G

Gast2

Gast
gut danke... bitte bis jetzt alles immer selber gemacht...
ja dass man auch komma zahlen eingeben kann
 
G

Gast2

Gast
nee im ersten nicht sobald das komma draußen ist bekommt man es nicht mehr rein...
1.Kann man auch eine eigene Klasse schreiben die so ein Formatter Default mäßig initalisiert?
[HIGHLIGHT="Java"]
public JDoubleField(String text, int columns, int limit) {
super(text, columns, limit);
NumberFormatter formatter =
new NumberFormatter(DecimalFormat.getCurrencyInstance(Locale.getDefault())){
@Override
public Object stringToValue(String text) throws ParseException {
return text.trim().length() == 0 ? null : super
.stringToValue(text);
}

@Override
public String valueToString(Object value) throws ParseException {
return value == null ? "" : super.valueToString(value);
}};
formatter.setAllowsInvalid(false);
setFormatterFactory(new DefaultFormatterFactory(formatter));

}

[/HIGHLIGHT]
2. kann man bestimmen ob er negative zahlen zulassen soll oder nicht
3. Kann man auch bestimmen ob er überhaupt trennungszeichen verwenden soll?

aso das oben sollte statt bitte = BITTER heißen ;)
 
G

Gast2

Gast
[HIGHLIGHT="Java"]
public JDoubleField(String text, int columns, int limit) {
super(text, columns, limit);
NumberFormatter formatter =
new NumberFormatter(NumberFormat.getNumberInstance(Locale.getDefault())){
@Override
public Object stringToValue(String text) throws ParseException {
return text.trim().length() == 0 || text.equals("-") ? null : super
.stringToValue(text);
}

@Override
public String valueToString(Object value) throws ParseException {
return value == null ? "" : super.valueToString(value);
}};
formatter.setAllowsInvalid(false);
setFormatterFactory(new DefaultFormatterFactory(formatter));
}

[/HIGHLIGHT]


1. Ich kann einfach kein komma eingeben
2. Und wenn ich jetzt einen Filer setze schlägt dieser nicht an also wie kann ich die eingabe einschreänke z.B. nur 10 ziffern erlaubt
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Zuletzt bearbeitet:

Ebenius

Top Contributor
1.Kann man auch eine eigene Klasse schreiben die so ein Formatter Default mäßig initalisiert?
Sicher kann man das. Aber eine Factory fänd ich da angebrachter.

2. kann man bestimmen ob er negative zahlen zulassen soll oder nicht
Würde ich in stringToValue machen. Einfach den Wert mit min und max prüfen.

3. Kann man auch bestimmen ob er überhaupt trennungszeichen verwenden soll?
Das bestimmt man im NumberFormat. Guck mal in die API-Doc. :rtfm:

1. Ich kann einfach kein komma eingeben
Hab's mir eben angesehen. Das passiert logischer Weise, da bei jedem Tastenschlag der Text in einen Wert konvertiert wird und dann der Wert in einen Text. Dabei geht das optionale Trennzeichen natürlich drauf. Auf die Schnelle konnte ich das nicht lösen.

Ich hab den Schalter allowInvalidEdit bei Zahlen immer auf true. Das finde ich angenehmer, die Zahl wird ohnehin validiert, wenn der Fokus gewechselt wird.

Java:
text.equals("-")
Würde ich nicht machen. Sonst gibt's auch dabei Fehler. Außerdem ist nicht überall das "-" das Zeichen für den negativen Wert.

Ebenius
 
G

Gast2

Gast
Hier mal was ich bis jetzt so hab
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.DocumentFilter;
import javax.swing.text.Highlighter;
import javax.swing.text.InternationalFormatter;
import javax.swing.text.JTextComponent;
import javax.swing.text.NumberFormatter;
import javax.swing.text.Highlighter.HighlightPainter;

public class CTextField extends JFormattedTextField {

	public final static int DEFAULT_LIMIT = 100;
	private final static Color MANDATORY_BACKGROUND_COLOR = new Color(251, 234,
			193);
	private final static Color FOCUS_BACKGROUND_COLOR = new Color(224, 254, 173);
	private final static Color INATIVE_BACKGROUND_COLOR = UIManager
			.getColor("TextField.inactiveBackground");
	private final static Color BACKGROUND_COLOR = UIManager
			.getColor("TextField.background");
	private boolean mandatory;
	private int limit;
	private TextFieldSytle sytle;

	public CTextField() {
		this("", 0, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(int columns) {
		this("", columns, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(String text) {
		this(text, 0, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(String text, int columns) {
		this(text, columns, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(TextFieldSytle style) {
		this("", 0, DEFAULT_LIMIT, style);
	}

	public CTextField(String text, int columns, int limit, TextFieldSytle sytle) {
		super();
		this.limit = limit;
		this.setSytle(sytle);
		InternationalFormatter formatter = null;
		installHighlightPainter();
		if (sytle.equals(TextFieldSytle.NORMAL)) {
			((AbstractDocument) getDocument())
					.setDocumentFilter(new TextDocumentFitler(this.limit));
		} else if (sytle.equals(TextFieldSytle.MONEY)) {
			formatter = new NumberFormatter(NumberFormat.getCurrencyInstance());
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(true);
		} else if (sytle.equals(TextFieldSytle.DATE)) {
			formatter = new Formatter(new SimpleDateFormat("dd.mm.yyyy"));
			setFormatterFactory(new DefaultFormatterFactory(formatter));
		} else if (sytle.equals(TextFieldSytle.INTEGER)) {
			formatter = new Formatter(NumberFormat.getIntegerInstance());
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(false);
		} else if (sytle.equals(TextFieldSytle.DOUBLE)) {
			formatter = new Formatter(new DecimalFormat());
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(true);
		} else if (sytle.equals(TextFieldSytle.PERCENT)) {
			formatter = new NumberFormatter(NumberFormat.getPercentInstance());
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(true);
			setValue(0.00);
		}
		setColumns(columns);
		if (text.length() > 0)
			setText(text);
	}

	private void installHighlightPainter() {
		Highlighter highlighter = getHighlighter();
		try {
			highlighter.addHighlight(0, 0, createHighlightPainter());
		} catch (BadLocationException ex) {
			assert false : "0:0 illegal?"; //$NON-NLS-1$
		}
	}

	// -------------------------------------------------------------------------
	// Bean getters and setters
	// -------------------------------------------------------------------------

	/**
	 * Returns the emptyTextHint.
	 * 
	 * @return the emptyTextHint
	 */
	public String getEmptyTextHint() {
		return (String) getClientProperty("emptyTextHint"); //$NON-NLS-1$
	}

	/**
	 * Sets the emptyTextHint.
	 * 
	 * @param hint
	 *            the emptyTextHint to set
	 */
	public void setEmptyTextHint(String hint) {
		putClientProperty("emptyTextHint", hint); //$NON-NLS-1$
		repaint();
	}

	protected HighlightPainter createHighlightPainter() {
		return new Highlighter.HighlightPainter() {

			final JLabel label = new JLabel("", //$NON-NLS-1$
					SwingConstants.TRAILING);
			final int gap = 3;

			public void paint(Graphics g, int p0, int p1, Shape bounds,
					JTextComponent c) {
				final String hint = (String) c.getClientProperty( //
						"emptyTextHint"); //$NON-NLS-1$
				if (hint == null || hint.length() == 0
						|| c.getDocument().getLength() != 0) {
					return;
				}
				label.setText(hint);

				final Insets ins = c.getInsets();
				final boolean ltr = c.getComponentOrientation().isLeftToRight();
				if (ltr) {
					ins.right += gap;
				} else {
					ins.left += gap;
				}

				final Dimension pref = label.getPreferredSize();
				final int prHeight = pref.height;
				final int prWidth = pref.width;
				final int w = Math.min(c.getWidth() - ins.left - ins.right,
						prWidth);
				final int h = Math.min(c.getWidth() - ins.top - ins.bottom,
						prHeight);
				final int x = ltr ? c.getWidth() - ins.right - w : ins.left;
				final int parentHeight = c.getHeight() - ins.top - ins.bottom;
				final int y = ins.top + (parentHeight - h) / 2;
				label.setForeground(Color.GRAY);
				label.setOpaque(false);
				SwingUtilities.paintComponent(g, label, c, x, y, w, h);
			}
		};
	}

	public boolean isMandatory() {
		return mandatory;
	}

	public void setMandatory(boolean mandatory) {
		if (mandatory)
			setBackground(MANDATORY_BACKGROUND_COLOR);
		else
			setBackground(BACKGROUND_COLOR);
		this.mandatory = mandatory;
		checkBackgroundColor();
	}

	public void setLimit(int limit) {
		this.limit = limit;
	}

	public int getLimit() {
		return limit;
	}

	@Override
	protected void processFocusEvent(FocusEvent e) {
		super.processFocusEvent(e);
		if (e.getID() == FocusEvent.FOCUS_GAINED) {
			focusGained(e);
		} else if (e.getID() == FocusEvent.FOCUS_LOST) {
			focusLost(e);
		}
	}

	private void focusGained(FocusEvent e) {
		setBackground(FOCUS_BACKGROUND_COLOR);
		checkBackgroundColor();
		doFocusGained(e);
	}

	private void focusLost(FocusEvent e) {
		if (mandatory)
			setBackground(MANDATORY_BACKGROUND_COLOR);
		else
			setBackground(BACKGROUND_COLOR);

		checkBackgroundColor();
		doFocusLost(e);

	}

	protected void doFocusGained(FocusEvent e) {
	};

	protected void doFocusLost(FocusEvent e) {
	};

	private void checkBackgroundColor() {
		if (!isEnabled())
			setBackground(getDisabledTextColor());
		if (!isEditable())
			setBackground(INATIVE_BACKGROUND_COLOR);
	}

	public class TextDocumentFitler extends DocumentFilter {

		private int limit;

		public TextDocumentFitler(int limit) {
			this.limit = limit;
		}

		public void insertString(FilterBypass fb, int offs, String str,
				AttributeSet a) throws BadLocationException {

			if ((fb.getDocument().getLength() + str.length()) <= limit)
				super.insertString(fb, offs, str, a);
			else
				Toolkit.getDefaultToolkit().beep();
		}

	}

//	@Override
//	public void setValue(Object value) {
//		try {
//			super.setValue(value);
//		} catch (Exception e) {
//			super.setValue(null);
//		}
//	}

	private class Formatter extends InternationalFormatter {

		public Formatter(Format format) {
			super(format);
		}

		@Override
		public Object stringToValue(String text) throws ParseException {
			return text.trim().length() == 0 ? null : super.stringToValue(text);
		}

		@Override
		public String valueToString(Object value) throws ParseException {
			return value == null ? "" : super.valueToString(value);
		}
	}
	
	public static void main(String[] args) {
		final JPanel contentPane = new JPanel(new GridLayout(0, 1));
		{
			final CTextField ftf = new CTextField(TextFieldSytle.MONEY);
			ftf.setColumns(10);
			ftf.setValue(8.45);
			contentPane.add(ftf);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.DOUBLE);
			ftf.setColumns(10);
			contentPane.add(ftf);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.INTEGER);
			ftf.setColumns(10);
			ftf.setEmptyTextHint("Zahl eingeben");
			contentPane.add(ftf);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.PERCENT);
			ftf.setColumns(10);
			contentPane.add(ftf);
			ftf.setValue(44.0);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.DATE);
			ftf.setColumns(10);
			contentPane.add(ftf);
		}

		final JFrame f = new JFrame("Test Frame: JFormattedTextFields");
		f.setContentPane(contentPane);
		f.pack();
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	public void setSytle(TextFieldSytle sytle) {
		this.sytle = sytle;
	}

	public TextFieldSytle getSytle() {
		return sytle;
	}

}

Java:
public enum TextFieldSytle {
	    NORMAL, MONEY, INTEGER, DOUBLE, PERCENT, DATE
}

Was mir jetzt noch fehlt (find ich)!!!
1.man sollte auschalten können ob negative Zahlen erlaubt sind oder nicht!
2. Was noch cool wäre wenn es bei decimal auch gleich geparsed würde und dass man das trennzeichen eingeben kann...
3. in meinem Integer feld kann minus nur eingeben wenn das offset 0 ist sollte von überall gehen ...(gelöst)
4. wenn man ein artikel feld hat sollte man die trennzeichen austellen können (bis jetzt noch nicht gefunden)setDecimalShow oder sowa klappt nicht
5.das prozent feld ist noch komisch setValue(44) sollte 44% da stehen nicht 4.400%
6. das date fels sollte noch einen kalender haben den bau ich jetzt mal an...(gelöst)
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
So mit Kalender man brauch das jar von JCalendar Java Bean, a Java Date Chooser
Problem 3 und 6 sind weg.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.DocumentFilter;
import javax.swing.text.Highlighter;
import javax.swing.text.InternationalFormatter;
import javax.swing.text.JTextComponent;
import javax.swing.text.NumberFormatter;
import javax.swing.text.Highlighter.HighlightPainter;

import com.toedter.calendar.JCalendar;

public class CTextField extends JFormattedTextField implements
		PropertyChangeListener {

	public final static int DEFAULT_LIMIT = 100;
	private static final String BUTTON_ICON = "DateChooserCombo.png";
	private static final String DATE_PATTERN = "dd.MM.yyyy";
	private final static Color MANDATORY_BACKGROUND_COLOR = new Color(251, 234,
			193);
	private final static Color FOCUS_BACKGROUND_COLOR = new Color(224, 254, 173);
	private final static Color INATIVE_BACKGROUND_COLOR = UIManager
			.getColor("TextField.inactiveBackground");
	private final static Color BACKGROUND_COLOR = UIManager
			.getColor("TextField.background");
	private boolean mandatory;
	private int limit;
	private TextFieldSytle sytle;
	private JCalendar calendar;
	private JDialog dialog;
	private InternationalFormatter formatter;
	public CTextField() {
		this("", 0, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(int columns) {
		this("", columns, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(String text) {
		this(text, 0, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(String text, int columns) {
		this(text, columns, DEFAULT_LIMIT, TextFieldSytle.NORMAL);
	}

	public CTextField(TextFieldSytle style) {
		this("", 0, DEFAULT_LIMIT, style);
	}
	
	

	public CTextField(String text, int columns, int limit, TextFieldSytle sytle) {
		super();
		this.limit = limit;
		this.setSytle(sytle);
		installHighlightPainter();
		if (sytle.equals(TextFieldSytle.NORMAL)) {
			((AbstractDocument) getDocument())
					.setDocumentFilter(new TextDocumentFitler(this.limit));
		} else if (sytle.equals(TextFieldSytle.MONEY)) {
			NumberFormat format = NumberFormat.getCurrencyInstance();
			format.setMaximumIntegerDigits(limit);
			formatter = new NumberFormatter(format);
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(true);
			setValue(0.00);
		} else if (sytle.equals(TextFieldSytle.DATE)) {
			formatter = new InFormatter(new SimpleDateFormat(DATE_PATTERN));
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			AbstractAction openCalendarAction = new AbstractAction() {
				public void actionPerformed(ActionEvent e) {
					onActionPerformed(e);
				}
			};
			JButton mControlButton = new JButton(openCalendarAction);
			final String actionKey = "enter";
			KeyStroke enter = KeyStroke
					.getKeyStroke(KeyEvent.VK_ENTER, 0, true);
			InputMap inputMap = mControlButton.getInputMap();
			inputMap.put(enter, actionKey);
			ActionMap actionMap = mControlButton.getActionMap();
			actionMap.put(actionKey, openCalendarAction);
			mControlButton.setIcon(new ImageIcon(getClass().getResource(
					BUTTON_ICON)));
			// mControlButton.setMargin(new Insets(0,0,0,0));
			mControlButton.setPreferredSize(new Dimension(16, 16));
			mControlButton.setMaximumSize(new Dimension(16, 16));
			calendar = new JCalendar();
			calendar.getDayChooser().addPropertyChangeListener(this);
			setLayout(new BorderLayout());
			add(mControlButton, BorderLayout.EAST);
		} else if (sytle.equals(TextFieldSytle.INTEGER) ) {
			DecimalFormat format = new DecimalFormat();
			format.setMaximumIntegerDigits(limit);
			format.setParseIntegerOnly(true);
			format.setDecimalSeparatorAlwaysShown(false);
			formatter = new NuFormatter(format);
			formatter.setAllowsInvalid(false);
			setFormatterFactory(new DefaultFormatterFactory(formatter));

		} else if (sytle.equals(TextFieldSytle.DOUBLE)) {
			DecimalFormat format = new DecimalFormat();
			format.setMaximumIntegerDigits(limit);
			formatter = new NuFormatter(format);
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(true);
		} else if (sytle.equals(TextFieldSytle.PERCENT)) {
			NumberFormat format = NumberFormat.getPercentInstance();
			format.setMaximumIntegerDigits(limit);
			format.setMaximumFractionDigits(2);
			formatter = new NumberFormatter(format);
			setFormatterFactory(new DefaultFormatterFactory(formatter));
			formatter.setAllowsInvalid(true);
			setValue(0.0);
		}
		setColumns(columns);
		if (text.length() > 0)
			setText(text);
	}

	private void installHighlightPainter() {
		Highlighter highlighter = getHighlighter();
		try {
			highlighter.addHighlight(0, 0, createHighlightPainter());
		} catch (BadLocationException ex) {
			assert false : "0:0 illegal?"; //$NON-NLS-1$
		}
	}

	// -------------------------------------------------------------------------
	// Bean getters and setters
	// -------------------------------------------------------------------------

	/**
	 * Returns the emptyTextHint.
	 * 
	 * @return the emptyTextHint
	 */
	public String getEmptyTextHint() {
		return (String) getClientProperty("emptyTextHint"); //$NON-NLS-1$
	}

	/**
	 * Sets the emptyTextHint.
	 * 
	 * @param hint
	 *            the emptyTextHint to set
	 */
	public void setEmptyTextHint(String hint) {
		putClientProperty("emptyTextHint", hint); //$NON-NLS-1$
		repaint();
	}

	protected HighlightPainter createHighlightPainter() {
		return new Highlighter.HighlightPainter() {

			final JLabel label = new JLabel("", //$NON-NLS-1$
					SwingConstants.TRAILING);
			final int gap = 3;

			public void paint(Graphics g, int p0, int p1, Shape bounds,
					JTextComponent c) {
				final String hint = (String) c.getClientProperty( //
						"emptyTextHint"); //$NON-NLS-1$
				if (hint == null || hint.length() == 0
						|| c.getDocument().getLength() != 0) {
					return;
				}
				label.setText(hint);

				final Insets ins = c.getInsets();
				final boolean ltr = c.getComponentOrientation().isLeftToRight();
				if (ltr) {
					ins.right += gap;
				} else {
					ins.left += gap;
				}

				final Dimension pref = label.getPreferredSize();
				final int prHeight = pref.height;
				final int prWidth = pref.width;
				final int w = Math.min(c.getWidth() - ins.left - ins.right,
						prWidth);
				final int h = Math.min(c.getWidth() - ins.top - ins.bottom,
						prHeight);
				final int x = ltr ? c.getWidth() - ins.right - w : ins.left;
				final int parentHeight = c.getHeight() - ins.top - ins.bottom;
				final int y = ins.top + (parentHeight - h) / 2;
				label.setForeground(Color.GRAY);
				label.setOpaque(false);
				SwingUtilities.paintComponent(g, label, c, x, y, w, h);
			}
		};
	}

	public boolean isMandatory() {
		return mandatory;
	}

	public void setMandatory(boolean mandatory) {
		if (mandatory)
			setBackground(MANDATORY_BACKGROUND_COLOR);
		else
			setBackground(BACKGROUND_COLOR);
		this.mandatory = mandatory;
		checkBackgroundColor();
	}

	public void setLimit(int limit) {
		this.limit = limit;
	}

	public int getLimit() {
		return limit;
	}

	@Override
	protected void processFocusEvent(FocusEvent e) {
		super.processFocusEvent(e);
		if (e.getID() == FocusEvent.FOCUS_GAINED) {
			focusGained(e);
		} else if (e.getID() == FocusEvent.FOCUS_LOST) {
			focusLost(e);
		}
	}

	private void focusGained(FocusEvent e) {
		setBackground(FOCUS_BACKGROUND_COLOR);
		checkBackgroundColor();
		doFocusGained(e);
	}

	private void focusLost(FocusEvent e) {
		if (mandatory)
			setBackground(MANDATORY_BACKGROUND_COLOR);
		else
			setBackground(BACKGROUND_COLOR);

		checkBackgroundColor();
		doFocusLost(e);

	}

	protected void doFocusGained(FocusEvent e) {
	};

	protected void doFocusLost(FocusEvent e) {
	};

	private void checkBackgroundColor() {
		if (!isEnabled())
			setBackground(getDisabledTextColor());
		if (!isEditable())
			setBackground(INATIVE_BACKGROUND_COLOR);
	}

	public class TextDocumentFitler extends DocumentFilter {

		private int limit;

		public TextDocumentFitler(int limit) {
			this.limit = limit;
		}

		public void insertString(FilterBypass fb, int offs, String str,
				AttributeSet a) throws BadLocationException {

			if ((fb.getDocument().getLength() + str.length()) <= limit)
				super.insertString(fb, offs, str, a);
			else
				Toolkit.getDefaultToolkit().beep();
		}

	}

	// @Override
	// public void setValue(Object value) {
	// try {
	// super.setValue(value);
	// } catch (Exception e) {
	// super.setValue(null);
	// }
	// }

	private class InFormatter extends InternationalFormatter {

		public InFormatter(Format format) {
			super(format);
		}

		@Override
		public Object stringToValue(String text) throws ParseException {
			return text.trim().length() == 0 ? null : super.stringToValue(text);
		}

		@Override
		public String valueToString(Object value) throws ParseException {
			return value == null ? "" : super.valueToString(value);
		}
	}

	private class NuFormatter extends NumberFormatter {

		public NuFormatter(NumberFormat format) {
			super(format);
		}

		@Override
		public Object stringToValue(String text) throws ParseException {
			if(getFormat() instanceof DecimalFormat)
			{
				return text.trim().length()  == 0 || text.equals(((DecimalFormat)getFormat()).getNegativePrefix())? null : super.stringToValue(text);
			}
			return text.trim().length() == 0 ? null : super.stringToValue(text);
		}

		@Override
		public String valueToString(Object value) throws ParseException {
			return value == null ? "" : super.valueToString(value);
		}
	}

	public static void main(String[] args) {
		final JPanel contentPane = new JPanel(new GridLayout(0, 1));
		{
			final CTextField ftf = new CTextField(TextFieldSytle.MONEY);
			ftf.setColumns(10);
			ftf.setValue(8.45);
			contentPane.add(ftf);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.DOUBLE);
			ftf.setColumns(10);
			contentPane.add(ftf);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.INTEGER);
			ftf.setColumns(10);
			ftf.setEmptyTextHint("Zahl eingeben");
			contentPane.add(ftf);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.PERCENT);
			ftf.setColumns(10);
			contentPane.add(ftf);
			ftf.setValue(44.02);
		}
		{
			final CTextField ftf = new CTextField(TextFieldSytle.DATE);
			ftf.setColumns(10);
			contentPane.add(ftf);
		}

		{
			final NumberFormatter nf = new NumberFormatter(NumberFormat
					.getInstance());
			nf.setAllowsInvalid(false);
			final JFormattedTextField ftf = new JFormattedTextField(nf);
			ftf.setColumns(10);
			ftf.setValue(0.1);
			contentPane.add(ftf);
		}

		final JFrame f = new JFrame("Test Frame: JFormattedTextFields");
		f.setContentPane(contentPane);
		f.pack();
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	public void setSytle(TextFieldSytle sytle) {
		this.sytle = sytle;
	}

	public TextFieldSytle getSytle() {
		return sytle;
	}

	private void onActionPerformed(ActionEvent e) {
		dialog = new JDialog();
		dialog.setLayout(new BorderLayout());
		dialog.add(calendar, BorderLayout.CENTER);
		dialog.setModal(true);
		dialog.setAlwaysOnTop(true);
		dialog.setResizable(false);
		dialog.pack();
		dialog.setLocationRelativeTo(this);
		dialog.setVisible(true);
	}

	@Override
	public void propertyChange(PropertyChangeEvent evt) {

		if ("day".equals(evt.getPropertyName())) {
			DateFormat formatter = new SimpleDateFormat(DATE_PATTERN);
			setText(formatter.format(calendar.getDate()));
			dialog.dispose();
		}

	}


}
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
1.man sollte auschalten können ob negative Zahlen erlaubt sind oder nicht!
Ist ja nicht so schwer. Ansatz:
Java:
Comparable<?> min = 0;
Comparable<?> max = 1000;

@SuppressWarnings("unchecked")
@Override
public Object stringToValue(String text) throws ParseException {
  if (text.trim().length() == 0) {
    return null;
  } else {
    final Object val = super.stringToValue(text);
    if (((Comparable) min).compareTo(val) > 0) {
      throw new ParseException("Value is lower than minimum", 0);
    } else if (((Comparable) max).compareTo(val) < 0) {
      throw new ParseException("Value is greater than maximum", 0);
    }
    return val;
  }
}

2. Was noch cool wäre wenn es bei decimal auch gleich geparsed würde und dass man das trennzeichen eingeben kann...
???:L Was ist "es"? Und was ist "bei decimal"? Und was ist das "trennzeichen"? Tausender- oder Dezimaltrennzeichen. Beides stellt man übrigens im NumberFormat ein. Schau mal in die API-Doc.

4. wenn man ein artikel feld hat sollte man die trennzeichen austellen können (bis jetzt noch nicht gefunden)setDecimalShow oder sowa klappt nicht
Der NumberFormatter benutzt ein NumberFormat. Also NumberFormat.setGroupingUsed(false).

5.das prozent feld ist noch komisch setValue(44) sollte 44% da stehen nicht 4.400%
Häh? Ein NumberFormat formatiert eine Zahl. Natürlich formatiert das Percent-NumberFormat die Zahl 0.44 als 44%. Sonst würde ich dem aber was husten!

Ebenius
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ok dank dir erstmal.
Das mit den negativen Werten versuch ich jetzt mal.

Ich meinte ob es eine möglichkeit gibt bei gleitkomma zahlen, dass formatter.setAllowsInvalid(false); zu setzen, damit er schon vorher verhindert dass buchstaben eingegeben werden. Das problem ist wie gesagt, dass man kein Komma(oder egal welches Trennzeichen) auch immer eingeben kann.

EDIT: versteh deinen Ansatz von oben nicht so ganz ...
Eigentlich müsste ich doch nur das ((DecimalFormat) getFormat()).getNegativePrefix() auf null setzen oder leer
und wenn ich es an will das alte wieder setzen oder?
So könnte ich auch erlauben das minus im textfeld rauszulöschen weil du doch oben gesagt hast text.equals("-") wäre nicht gut , aber text.equals(((DecimalFormat) getFormat()).getNegativePrefix()) müsste doch gehen oder?
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
was ich auch noch komische finde wenn ich so ein geld textfeld habe dass ich bei getValue einmal Long zurück bekomme und einmal Double...
 
G

Gast2

Gast
Das liegt am Format. DecimalFormat erzeugt ein Long-Objekt, wenn die Zahl als Long geparsed werden kann; ansonsten ein Double-Objekt. Siehe API-Doc.

Ebenius

kann man das abstellen, dass er nur Double zurückliefert? oder musst ich die getValue Methode überschreiben und das selber sicherstellen?
 

Ebenius

Top Contributor
Mach das im Formatter bei stringToValue(). Bist Du sicher, dass Du das Konzept des JFormattedTextField verstanden hast?

Ebenius
 
G

Gast2

Gast
Wenn du mich so dirket frägst glaub noch nicht so ganz.
Also das Textfeld hat ein Formatter der regelt was erlaubt ist anzuzeigen.Und formattiert enstprechend seinem Format die eingaben.

die stringToValue methode wird bei der eingabe augerufen und überprüft was nach dem formattieren zurückgegeben wird. wenn eine ParseException fliegt wird in dem txtfeld nichts gemacht ansonsten die eingabe formattiert und angezeigt.

und valueToString ka????

Integerfield
ich hatte ja noch das Problem,dass man den NegativePrefix nimmer löschen kann
dass habe ich so gelöst
Java:
        @Override
        public Object stringToValue(String text) throws ParseException {
            return text.trim().length() == 0 || text.equals(format.getNegativePrefix()) ? null : super.stringToValue(text);
        }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
I JTextfield senden über Enter AWT, Swing, JavaFX & SWT 1
H Swing Wie Fokus von JTextField entfernen? AWT, Swing, JavaFX & SWT 9
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1
G JTextField Änderungen überprüfen AWT, Swing, JavaFX & SWT 4
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
R Swing JTextField nicht-kopierbarer Text AWT, Swing, JavaFX & SWT 1
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
xYurisha Gui Focus von JTextField weglenken AWT, Swing, JavaFX & SWT 6
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
G JTextField Eingabe in DB speichern AWT, Swing, JavaFX & SWT 68
C JTextField Inhalt mit Maus selektieren wenn disabled AWT, Swing, JavaFX & SWT 2
R jTextField Eingabe überprüfen AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Wert in JTextField wird falsch ausgegeben AWT, Swing, JavaFX & SWT 2
D Inhalt von JTextField in MySQL speichern. Wie ? AWT, Swing, JavaFX & SWT 1
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
J 100% CPU Last mit JTextField AWT, Swing, JavaFX & SWT 2
U Swing JTextField aus dem Editmodus nehmen AWT, Swing, JavaFX & SWT 1
Q-bert JTextField per Mausklick einfügen AWT, Swing, JavaFX & SWT 3
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
BobbGott durchsichtiges JTextField mit Hintergrund AWT, Swing, JavaFX & SWT 12
L Swing JTextField nicht sichtbar AWT, Swing, JavaFX & SWT 1
Soloeco Swing JTextField auslesen Klassen übergreifend AWT, Swing, JavaFX & SWT 16
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
N Swing Jtextfield und Ausgabe von Wärungsbeträgen AWT, Swing, JavaFX & SWT 3
beatles Swing JTextField - Game Status aus Array anzeigen AWT, Swing, JavaFX & SWT 3
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
KaffeeFan mehrere JTextField durchlaufen AWT, Swing, JavaFX & SWT 4
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
K Swing unterschied JTextField und JLabel AWT, Swing, JavaFX & SWT 7
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
B jTextfield Übergabe des Strings AWT, Swing, JavaFX & SWT 16
P JTextField unsichtbar machen AWT, Swing, JavaFX & SWT 2
G .txt-Datei einlesen /formatieren in JTextfield ?? AWT, Swing, JavaFX & SWT 8
C Swing JTextField Funktion zuweisen - Löschen von Buchstaben/Sonderzeichen AWT, Swing, JavaFX & SWT 6
S JTextField parameter unveränderlich AWT, Swing, JavaFX & SWT 9
T bekomme keinen Focus auf JTextField AWT, Swing, JavaFX & SWT 3
N Cursor im JTextField AWT, Swing, JavaFX & SWT 6
T Swing NullPointerException beim auslesen von jTextField - Anfänger! AWT, Swing, JavaFX & SWT 3
A JTextField und JButtons AWT, Swing, JavaFX & SWT 2
T jTextField mit String befüllen AWT, Swing, JavaFX & SWT 1
O JTextfield wird über'drawed'.. AWT, Swing, JavaFX & SWT 6
M Swing JtextField Panel in ander Panel aufrufen AWT, Swing, JavaFX & SWT 0
S Bekomme bein Buttonklick das Jtextfield nicht ausgegeben AWT, Swing, JavaFX & SWT 8
Seikuassi Swing JTextField nimmt kein Einfügen (Strg+V) an AWT, Swing, JavaFX & SWT 4
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
M Swing JTextField getText Mehtode übergeben in eine Klasse zu einer Rechnung AWT, Swing, JavaFX & SWT 1
B Swing JTextField mit Bildschirmauflösung skalieren lassen. AWT, Swing, JavaFX & SWT 4
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
T AWT JTextfield verschwindet AWT, Swing, JavaFX & SWT 10
dat_vin KeyEvent jTextField AWT, Swing, JavaFX & SWT 12
C JTextfield ohne Enter feuern AWT, Swing, JavaFX & SWT 8
W Swing JTextField nur für Integer AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
F Swing JTextField (unbeschriebbar machen) AWT, Swing, JavaFX & SWT 12
W JTextfield - Wert lässt sich nicht setzen AWT, Swing, JavaFX & SWT 3
TheJavaKid JTextField: Reine Domain herausfiltern, sonst Inhalt löschen AWT, Swing, JavaFX & SWT 1
R Swing User tippt in unsichtbares JTextField AWT, Swing, JavaFX & SWT 3
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
U Swing JTextField zur Laufzeit auf Eingaben prüfen AWT, Swing, JavaFX & SWT 0
X Swing JTextField AWT, Swing, JavaFX & SWT 4
M Swing JTextField nicht ausfüllbar AWT, Swing, JavaFX & SWT 8
C Problem mit JTextField AWT, Swing, JavaFX & SWT 4
S Swing WYSIWYG JTextField AWT, Swing, JavaFX & SWT 2
vodkaz JTextField && Strings AWT, Swing, JavaFX & SWT 2
R Swing JScrollBar mit JTextField koppeln AWT, Swing, JavaFX & SWT 3
A Swing 2 JSlider verknüpfen und mit einem JTextField vergleichen, dann Ausgabe AWT, Swing, JavaFX & SWT 5
X JTextField Ausgabe klappt nicht AWT, Swing, JavaFX & SWT 4
S Swing Verzeichnis/Datei-Pfad in JTextField schreiben AWT, Swing, JavaFX & SWT 2
R Swing JTextField getText() liefert leeren String AWT, Swing, JavaFX & SWT 6
J Mausfarbe ändern JTextField AWT, Swing, JavaFX & SWT 6
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
A editable JTextField & setText AWT, Swing, JavaFX & SWT 2
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
M JTextField gibt beim auslesen null aus AWT, Swing, JavaFX & SWT 9
K JTextField mit Standardtext AWT, Swing, JavaFX & SWT 3
F Swing JTextfield Beispieltext soll nach Klick verschwinden AWT, Swing, JavaFX & SWT 3
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4
I Swing JTextField ausblenden -? AWT, Swing, JavaFX & SWT 6
0 Swing JTextField - Position ? AWT, Swing, JavaFX & SWT 2
L Button über/auf JTextField AWT, Swing, JavaFX & SWT 5
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
M Swing jTextfield und PlainDocument AWT, Swing, JavaFX & SWT 18
D JTextField über ein Game AWT, Swing, JavaFX & SWT 11
A Swing JTextField durch einen JButton leeren AWT, Swing, JavaFX & SWT 15
Kaniee Swing Woher bekommt JTextField die Eingaben? AWT, Swing, JavaFX & SWT 2
M JTextField gesperrt nach erster Benutzung... AWT, Swing, JavaFX & SWT 4
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
R JTextField mit abgerundeten Ecken - Geht über Grenze hinaus AWT, Swing, JavaFX & SWT 4
R JTextField Eingabefeld innerhalb verschieben AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben