2014-09-17 7 views
5

मैंस्पिनर नियंत्रण में सम्मिलित केवल संख्या

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.Spinner; 
import javafx.scene.control.SpinnerValueFactory; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class MainApp extends Application 
{ 
    public static void main(String[] args) 
    { 
     Application.launch(args); 
    } 

    @Override 
    public void start(Stage stage) 
    { 
     final Spinner spinner = new Spinner(); 

     spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000)); 
     spinner.setEditable(true); 

     GridPane grid = new GridPane(); 
     grid.setHgap(10); 
     grid.setVgap(10); 
     grid.setPadding(new Insets(10)); 

     int row = 0; 

     grid.add(new Label("Spinner:"), 0, row); 
     grid.add(spinner, 1, row); 

     Scene scene = new Scene(grid, 350, 300); 

     stage.setTitle("Hello Spinner"); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

8u40 जावा में स्पिनर नियंत्रण का परीक्षण कैसे मैं केवल स्पिनर नियंत्रण के क्षेत्र में नंबर सम्मिलित कर सकते हैं?

अब मैं संख्याएं और टेक्स्ट डाल सकता हूं। क्या कोई उदाहरण है जिसका प्रयोग उदाहरण के रूप में किया जा सकता है?

+0

क्या आपको अपनी समस्या के लिए कोई बेहतर समाधान मिला? – babyinEclipse

उत्तर

4
  • क्योंकि स्पिनर एक संपादक के रूप TextField का उपयोग करता है, उपयोगकर्ताओं को स्पिनर में किसी भी स्ट्रिंग सम्मिलित कर सकते हैं
  • उपयोगकर्ता के बाद ही वापस कुंजी तो स्पिनर्स मॉडल (SpinnerValueFactory कार्यान्वयन) की पुष्टि करता है उपयोगकर्ताओं इनपुट

तो आप हिट नहीं की संख्या के साथ

// imports omitted 

public class MainApp extends Application { 

protected static final String INITAL_VALUE = "0"; 

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

@Override 
public void start(Stage stage) { 
    final Spinner spinner = new Spinner(); 

    spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000, 
      Integer.parseInt(INITAL_VALUE))); 
    spinner.setEditable(true); 

    EventHandler<KeyEvent> enterKeyEventHandler; 

    enterKeyEventHandler = new EventHandler<KeyEvent>() { 

     @Override 
     public void handle(KeyEvent event) { 

      // handle users "enter key event" 
      if (event.getCode() == KeyCode.ENTER) { 

       try { 
    // yes, using exception for control is a bad solution ;-) 
      Integer.parseInt(spinner.getEditor().textProperty().get()); 
       } 
       catch (NumberFormatException e) { 

        // show message to user: "only numbers allowed" 

        // reset editor to INITAL_VALUE 
        spinner.getEditor().textProperty().set(INITAL_VALUE); 
       } 
      } 
     } 
    }; 

    // note: use KeyEvent.KEY_PRESSED, because KeyEvent.KEY_TYPED is to late, spinners 
    // SpinnerValueFactory reached new value before key released an SpinnerValueFactory will 
    // throw an exception 
    spinner.getEditor().addEventHandler(KeyEvent.KEY_PRESSED, enterKeyEventHandler); 

    GridPane grid = new GridPane(); 
    grid.setHgap(10); 
    grid.setVgap(10); 
    grid.setPadding(new Insets(10)); 

    int row = 0; 

    grid.add(new Label("Spinner:"), 0, row); 
    grid.add(spinner, 1, row); 

    Scene scene = new Scene(grid, 350, 300); 

    stage.setTitle("Hello Spinner"); 
    stage.setScene(scene); 
    stage.show(); 
} 
} 
  • कोशिश: कोड से स्पिनर्स संपादक को मान्यता जोड़ने के लिए सह डी INITIAL_VALUE साथ स्पिनरों संपादक सामग्री का स्थान ले लेगा
  • सीमा से बाहर की संख्या के साथ की कोशिश, स्पिनरों मॉडल स्पिनरों मान्य मान
5

नहीं पूरी तरह से आवश्यकता के बारे में कुछ करने के लिए संपादक को रीसेट कर देगा - यह सोचते हैं कि आप पात्रों के इनपुट को रोकने के लिए चाहते हैं जो वैध संख्या में पार्स नहीं करेगा।

यदि ऐसा है, तो स्पिनर के संपादक में टेक्स्टफॉर्मेटर का उपयोग बचाव के लिए आता है: इसके साथ, आप टेक्स्ट के किसी भी बदलाव की निगरानी करेंगे और या तो इसे स्वीकार या अस्वीकार करेंगे। निर्णय फॉर्मेटर के फ़िल्टर के अंदर encapsulated है। एक बहुत ही सरल संस्करण (स्विंग के डिफॉल्टफॉर्मेटर को देखने के लिए निश्चित रूप से और अधिक है)

// get a localized format for parsing 
NumberFormat format = NumberFormat.getIntegerInstance(); 
UnaryOperator<TextFormatter.Change> filter = c -> { 
    if (c.isContentChange()) { 
     ParsePosition parsePosition = new ParsePosition(0); 
     // NumberFormat evaluates the beginning of the text 
     format.parse(c.getControlNewText(), parsePosition); 
     if (parsePosition.getIndex() == 0 || 
       parsePosition.getIndex() < c.getControlNewText().length()) { 
      // reject parsing the complete text failed 
      return null; 
     } 
    } 
    return c; 
}; 
TextFormatter<Integer> priceFormatter = new TextFormatter<Integer>(
     new IntegerStringConverter(), 0, filter); 

spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(
     0, 10000, Integer.parseInt(INITAL_VALUE))); 
spinner.setEditable(true); 
spinner.getEditor().setTextFormatter(priceFormatter); 
+0

डाउनवॉटर, समझाने की देखभाल? – kleopatra

+0

संरेखण डाउनवॉटर नहीं, लेकिन यहां मेरी व्याख्या है: आपका क्रियात्मक समाधान काम नहीं करता है। जब मैंने इसका इस्तेमाल करने की कोशिश की, तो स्पिनर की दृश्य सामग्री कताई पर नहीं बदली। माना जाता है कि, मैं जल्दी में था और गहराई में नहीं गया (जैसा कि आपने सुझाव दिया है, कभी भी स्विंग के डिफॉल्टफॉर्मेटर की जांच नहीं की गई), लेकिन तथ्य यह है कि आपका कोड मूल स्पिनर मैकेनिक तोड़ने वाला एक बमर था - और अंत में मैंने टेक्स्टफिल्ड्स का सत्यापन किया सबमिशन, एक संवाद पर त्रुटियों को दिखाया जा रहा है, जो किसी भी तरह व्यावहारिक, समाधान के बावजूद बेहद दुखी था। –

+0

@GiulioPiancastelli आपकी प्रतिक्रिया के लिए धन्यवाद :-) यह थोड़ी देर हो गया है लेकिन अपेक्षाकृत निश्चित है कि जब मैंने जवाब लिखा था, तो कम से कम यह कल्पना नहीं कर सका कि मैंने मानक व्यवहार की जांच नहीं की होगी - हालांकि, होता है। इन दिनों में से किसी एक को आजमाएं और यदि आवश्यक हो तो अपडेट करें। – kleopatra

संबंधित मुद्दे