मैं एक मुद्रा को संपादित करने के लिए जावाएफएक्स टेक्स्टफिल्ड कैसे प्राप्त करूं जो गुटीय अंकों के बिना संग्रहीत है (उदाहरण के लिए एक लंबा)? डाटाबेसिंग, टेक्स्टफॉर्मेटर और अन्य जावाएफएक्स सामग्री का उपयोग करना।

लक्ष्य होना चाहिए:

  • एक लॉन्गप्रॉपर्टी के साथ बो (सेंट में मुद्रा मूल्य)
  • एक संपादन योग्य टेक्स्टफिल्ड, उपयोगकर्ता ज्ञात प्रारूप में (ऑप्टिल अग्रणी ऋण, हजारों विभाजक, दशमलव विभाजक, (मुद्रा प्रतीक), और कोई अन्य वर्ण संभव नहीं है)
  • बो और टेक्स्टफिल्ड के बीच द्विदिशा बाइंडिंग।
1
Jonny 7 अगस्त 2020, 16:45

1 उत्तर

सबसे बढ़िया उत्तर

यहां एक समाधान है (शायद सबसे अच्छा नहीं, कृपया टिप्पणी करें कि क्या मैं इसे सुधार सकता हूं)

बो:

import java.util.Random;

import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;

public class SimpleBo {
        //a simple LongProperty to store the currency without fractional digits (56,81 € would be 5681)
        private LongProperty currencyLong = new SimpleLongProperty();
        public SimpleBo() {
            setCurrencyLong(new Random().nextLong());
        }
        public final LongProperty currencyLongProperty() {
            return this.currencyLong;
        }
        public final long getCurrencyLong() {
            return this.currencyLongProperty().get();
        }
        public final void setCurrencyLong(final long currencyLong) {
            this.currencyLongProperty().set(currencyLong);
        }
}

स्ट्रिंग कनवर्टर के लिए एक संख्या:

import java.text.NumberFormat;
import java.util.Locale;

import javafx.util.converter.NumberStringConverter;

public class MyNumberStringConverter extends NumberStringConverter {
    public MyNumberStringConverter() {
        super();
    }

    public MyNumberStringConverter(Locale locale, String pattern) {
        super(locale, pattern);
    }

    public MyNumberStringConverter(Locale locale) {
        super(locale);
    }

    public MyNumberStringConverter(NumberFormat numberFormat) {
        super(numberFormat);
    }

    public MyNumberStringConverter(String pattern) {
        super(pattern);
    }

    @Override
    public Number fromString(String value) {
        //to transform the double, given by the textfield, just multiply by 100 and round if any left
        Number rValue = Math.round(super.fromString(value).doubleValue() * 100);
        return rValue.longValue();
    }

    @Override
    public String toString(Number value) {
        if(value == null) {
            return "";
        }
        //Check for too big long value
        //If the long is too big, it could result in a strange double value.
        if(value.longValue() > 1000000000000l || value.longValue() < -1000000000000l ) {
            return "";
        }
        BigDecimal myBigDecimal = new BigDecimal(value.longValue());
        //to convert the long to a double (currency with fractional digits)
        myBigDecimal = myBigDecimal.movePointLeft(2);
        double asDouble = myBigDecimal.doubleValue();
        if(asDouble == Double.NEGATIVE_INFINITY || asDouble == Double.POSITIVE_INFINITY) {
            return "";
        }
        return super.toString(asDouble);
    }

कक्षा तक:

import java.util.function.UnaryOperator;
import javafx.scene.control.TextFormatter;

public class Util {

    // This will filter the changes
    public static UnaryOperator<TextFormatter.Change> createFilter() {
        //this is a simple Regex to define the acceptable Chars
        String validEditingStateRegex = "[0123456789,.-]*";
        return change -> {
            String text = change.getText();
            //Check if something changed and just return if not
            if (!change.isContentChange()) {
                return change;
            }
            //check if the changed text validates against the regex
            if (text.matches(validEditingStateRegex) || text.isEmpty()) {
                //if valid return the change
                return change;
            }
            //otherwise return null
            return null;
        };
    }
}

परीक्षण आवेदन:

import java.text.NumberFormat;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class BindingExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Scene scene = new Scene(createBindingExample());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    //Creates just a sample gui with a Business Objekt 
    public static Parent createBindingExample() {
        VBox vbox = new VBox();
        SimpleBo myBo = new SimpleBo();
        TextField myTextField = new TextField();
        Label fooLabel = new Label();

        //Setting up the textField with a Formatter
        NumberFormat nFormat = NumberFormat.getInstance();
        //Define the integer and fractional digits
        nFormat.setMinimumIntegerDigits(1);
        nFormat.setMaximumFractionDigits(2);
        //setting up the TextFormatter with the NumberFormat and a Filter to limit the inputchars
        TextFormatter<Number> textFormatter = new TextFormatter<>(new MyNumberStringConverter(nFormat), 0l,
                Util.createFilter());
        //Bind (Bidirectional) the BO currency value to the textformatter value
        textFormatter.valueProperty().bindBidirectional(myBo.currencyLongProperty());
        myTextField.setTextFormatter(textFormatter);

        //just to show the currency value, bind it to the label
        fooLabel.textProperty().bind(myBo.currencyLongProperty().asString());

        vbox.getChildren().add(myTextField);
        //just for spacing
        vbox.getChildren().add(new Label(" "));
        vbox.getChildren().add(fooLabel);
        return vbox;
    }
}

आप टेक्स्टफिल्ड को एक एचबीओक्स के अंदर और मुद्रा प्रतीक के लिए एक लेबल डाल सकते हैं। या करेंसी सिंबल के ड्रॉपबॉक्स के साथ या जो भी हो। मुद्रा के साथ NumberFormat का उपयोग करना संभव होगा, इसलिए प्रारूप प्रतीक जोड़ देगा। लेकिन इसमें कुछ और कमियां हैं, इसलिए मैंने इस ओर अग्रसर किया।

0
Jonny 13 अगस्त 2020, 08:30