Hi Leutz.
Ich Prüfe TFormattedTextFields bei der eingabe ab und habe jetzt zwei Probleme.
Habe jetzt mal ein ein lauffähiges Prog dazu geschrieben damit sich das jemand anschauen kann.
mein 1 Problem.
sobald ich nur eine 1 stellige oder 2 stellige zahl eingebe, gibt er sie 2 mal aus..
z.B. eingabe 1 ausgabe 1,001,00
kann sich das bitte wer anschauen
ein kleines Prob ist auch das festlegen von den Nachkommastellen..
da ich höchstens 4 nachkommastellen haben kann habe ich es so gelöst..
merk = merk + 0.00000001; // das wird hinzuaddiert da Java beim casten abrundet!
aber das iss wohl net die feine englische art
evtl. weiss da auch einer ne lösung!
------------------------------------------------------
Ist das überhaupt der richtige Ansatz
Wie macht ihr sowas
Ich Prüfe TFormattedTextFields bei der eingabe ab und habe jetzt zwei Probleme.
Habe jetzt mal ein ein lauffähiges Prog dazu geschrieben damit sich das jemand anschauen kann.
mein 1 Problem.
sobald ich nur eine 1 stellige oder 2 stellige zahl eingebe, gibt er sie 2 mal aus..
z.B. eingabe 1 ausgabe 1,001,00
kann sich das bitte wer anschauen
Code:
import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestJFormattedTextField {
TestJFormattedTextField(){
JFrame frame = new JFrame();
frame.setSize(400,400);
JLabel lbl;
final JFormattedTextField tf_selbstkosten, tf_vk_preis1;
JPanel panel = new JPanel();
frame.add(panel);
panel.setLayout(null);
lbl = new JLabel("Selbstkosten");
lbl.setBounds(10, 15, 100, 25);
panel.add(lbl);
tf_selbstkosten = new JFormattedTextField();
tf_selbstkosten.setDocument(new DecimalDocument(10));
tf_selbstkosten.setBounds(130, 15, 100, 25);
tf_selbstkosten.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
tf_selbstkosten.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent arg0) {
tf_selbstkosten.setBackground(Color.YELLOW);
}
public void focusLost(FocusEvent arg0) {
MyPrepareClass.prepareDecimal(tf_selbstkosten, "######0.00", 10, 2);
tf_selbstkosten.setBackground(Color.WHITE);
}
});
panel.add(tf_selbstkosten);
lbl = new JLabel("VK-Preis 1");
lbl.setBounds(10, 40, 100, 25);
panel.add(lbl);
tf_vk_preis1 = new JFormattedTextField();
tf_vk_preis1.setDocument(new DecimalDocument(10));
tf_vk_preis1.setBounds(130, 40, 100, 25);
tf_vk_preis1.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
tf_vk_preis1.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent arg0) {
tf_vk_preis1.setBackground(Color.YELLOW);
}
public void focusLost(FocusEvent arg0) {
MyPrepareClass.prepareDecimal(tf_vk_preis1, "######0.00", 10, 2);
tf_vk_preis1.setBackground(Color.WHITE);
}
});
panel.add(tf_vk_preis1);
frame.setVisible(true);
}
public static void main(String[] args) {
new TestJFormattedTextField();
}
}
Code:
import java.text.DecimalFormat;
import javax.swing.JFormattedTextField;
public class MyPrepareClass {
MyPrepareClass(){
}
public static void prepareDecimal(JFormattedTextField ftf, String vorlage, int laenge, int nachkomma) {
//System.out.println(ftf.getText().indexOf(","));
if(ftf.getText().equals("")){
return;
}
// String in ein char-Array packen und prüfen ob mehrere "," vorhanden sind
char[] ch_hilf = new char[ftf.getText().length()];
ch_hilf = ftf.getText().toCharArray();
int komma_zaehl = 0;
int minus_zaehl = 0;
for(int i = 0; i < ch_hilf.length; i++){
if(ch_hilf[i] == ','){
komma_zaehl++;
}
if(ch_hilf[i] == '-'){
minus_zaehl++;
}
}
// Sind mehrere minus-Zeichen vorhanden, Textfeld löschen und Focus zurück setzten
if(minus_zaehl > 1){
ftf.setText("");
ftf.requestFocusInWindow();
return;
}
// Sind mehrere kommas vorhanden, Textfeld löschen und Focus zurück setzten
if(komma_zaehl > 1){
ftf.setText("");
ftf.requestFocusInWindow();
return;
}
// passt die anzahl der vorkommastellen (wenn 1 komma vorhanden ist)
if(komma_zaehl == 1){
String[] vor_nachkomma = ftf.getText().split(",");
if(vor_nachkomma[0].length()> laenge - nachkomma - 1){
ftf.setText("");
ftf.requestFocusInWindow();
return;
}
}
// passt die anzahl der vorkommastellen (wenn kein komma vorhanden ist)
if(komma_zaehl == 0){
if(ftf.getText().length()> laenge - nachkomma - 1){
ftf.setText("");
ftf.requestFocusInWindow();
return;
}
}
// erst "," durch "." ersetzten und Wert in einer Double Variablen merken
double merk = Double.parseDouble( ftf.getText().replace(",", ".") );
merk = merk + 0.00000001; // das wird hinzuaddiert da Java beim casten abrundet!
// jetzt *10^nachkomma rechnen und nach Integer Casten(um nachkommastellen zu entfernen)
merk = merk * Math.pow(10,nachkomma);
int merk_int = (int) merk;
System.out.println("merk_int : " + merk_int);
System.out.println("merk2 : " + merk);
merk = (double) merk_int / Math.pow(10,nachkomma);
System.out.println("merk3 : " + merk);
// Format festlegen
DecimalFormat df = new DecimalFormat ( vorlage );
System.out.println("merk4 : " + df.format(merk));
// formatiert zurück schreiben
System.out.println("Hier stimmts noch :" + String.valueOf(df.format(merk)).replace(".", ","));
ftf.setText(String.valueOf(df.format(merk)).replace(".", ","));
}
}
Code:
import javax.swing.text.PlainDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;
/**
* Diese Klasse ist ein Dokument für Textfelder, welches...
*
* 1. Eingabe auf x Zeichen begrenzt.
* 2. Nur die Zeichen zulässt die in der Variable valid stehen
*
* Die Zuweisung geschieht über
* JTextfield.setDocumenT(new Validation(int anzahl));
*/
public class DecimalDocument extends PlainDocument{
private static final long serialVersionUID = 5032290234368360350L;
private int limit;
/**
* Konstruktor für das Validationdokument
* @param int limit: maximale Anzahl der einzugebenen Zeichen
*/
public DecimalDocument(int newLimit){
super();
if (limit < 0){
limit = 0;
} else {
limit = newLimit;
}
}
/**
* Funktion überschreibt die Methode insertString von PlaintDocument
* @param int offset: Position
* @param String str: der String
* @param AttributeSet attr: Attributset
*/
public void insertString (int offset, String str, AttributeSet attr) throws BadLocationException {
if (str == null) return;
//Zeichenkette mit den gültigen Zeichen
String valid = "-,0123456789";
for (int i=0; i<str.length();i++) {
//System.out.println(str);
if (valid.indexOf(str.charAt(i)) == -1) {
// wenn man hier rein kommt ist das eingegebene Zeichen ungültig!!
return;
}
if ((getLength() + str.length()) > limit){
// wenn man hier rein kommt ist das übergebene limit erreicht
return;
}
//Wichtig Aufruf der übergeordneten Methode
super.insertString(offset, str, attr);
}
}
}
ein kleines Prob ist auch das festlegen von den Nachkommastellen..
da ich höchstens 4 nachkommastellen haben kann habe ich es so gelöst..
merk = merk + 0.00000001; // das wird hinzuaddiert da Java beim casten abrundet!
aber das iss wohl net die feine englische art

evtl. weiss da auch einer ne lösung!
------------------------------------------------------
Ist das überhaupt der richtige Ansatz
Wie macht ihr sowas