2017-02-20 18 views
-3

ラベルとテキストボックスが必要です。テキストボックスでは、ユーザーは入力テストのように、ラベル内のテキストを入力します。ユーザーが正しい文字を入力すると、ラベルの文字が緑色に変わります。この方法でユーザーテキストを処理するより良い方法はありますか?

これをJavaFXで実装します。私は基本的にラベルを配列に変換し、それがテキストボックス内のものと一致するかどうかを確認します。私は、テキストボックスの文字が配列と一致するかどうかを確認するために何を使用する必要があるのか​​分かりません。

+0

"ラベルを配列に変換する" - 何の配列ですか?キャラクター?なぜ文字列を使用しないのですか? –

+1

'if(label.getText()。startsWith(textField.getText())){...}' ...?しかし、始める前に、テキストフィールドのすべてのテキストが同じ色でなければならないことに注意してください。異なる文字にするために別の文字を使用する場合、 'TextField'は単純にそれをサポートしません。 –

答えて

0

あなたが求めていることを行う簡単なテストJavaFXアプリケーションを作成しました。

これは結果

The result

であり、これはコード

package sample; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.HPos; 
import javafx.geometry.Insets; 
import javafx.geometry.Orientation; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.*; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     primaryStage.setTitle("Hello World"); 
     Scene scene = new Scene(new Group(), 300, 275); 

     //Create a FlowPane that will contain many Text. 
     FlowPane flowLabel = new FlowPane(Orientation.HORIZONTAL); 
     flowLabel.setBackground(new Background(new BackgroundFill(Color.BEIGE, CornerRadii.EMPTY, Insets.EMPTY))); 
     flowLabel.setColumnHalignment(HPos.LEFT); 

     //This is the label text. The text that the user must insert 
     final String text = "Hello world!"; 

     //Create a Text object for each character 
     final Text[] characters = new Text[text.length()]; 
     for(int i = 0; i < text.length(); i++) { 
      Character c = text.charAt(i); 
      characters[i] = new Text(c.toString()); 
      flowLabel.getChildren().add(characters[i]); 
     } 

     //Create the text field and add a listener to do something when the text change. 
     TextField field = new TextField(); 
     field.textProperty().addListener(new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
       //Do the magic 
       String fieldText = newValue; 
       if(text.startsWith(fieldText)) { 
        for(int i = 0; i < text.length(); i++) { 
         if(i < fieldText.length()) { 
          characters[i].setFill(Color.GREEN); 
         } else { 
          characters[i].setFill(Color.BLACK); 
         } 
        } 
       } else { 
        for(int i = 0; i < text.length(); i++) { 
         characters[i].setFill(Color.RED); 
        } 
       } 
      } 
     }); 

     FlowPane pane = new FlowPane(Orientation.HORIZONTAL); 
     pane.setVgap(8); 
     pane.getChildren().add(flowLabel); 
     pane.getChildren().add(field); 

     ((Group)scene.getRoot()).getChildren().add(pane); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

である私は、これはそれを行うための最善の方法ではないと思われるが、続行するのに役立ちます。

0

私は私のバージョンでonkeyreleasedを使用しました。それは今のスペースを処理します。

import java.util.ArrayList; 
import java.util.List; 
import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

/** 
* 
* @author blj0011 
*/ 
public class JavaFXApplication35 extends Application { 

    @Override 
    public void start(Stage primaryStage) {   

     //Make each string char a text object 
     String text = "Hello World!"; 
     List<Text> characters = new ArrayList(); 
     for(int i = 0; i < text.length(); i++) 
     { 
      characters.add(new Text(text.charAt(i) + "")); 
     } 

     //create text area and set on key release listener 
     TextArea textarea = new TextArea(); 
     textarea.setOnKeyReleased(new EventHandler<KeyEvent>(){ 
      @Override 
      public void handle(KeyEvent event) {     
       for(int i = 0; i < characters.size(); i++) 
       {   
        //handle when index i is less than the number of characters typed in the text area 
        if(i < textarea.getText().length()) 
        { 
         //if the characters at the given index are equal, set the text object at that index to green 
         if(textarea.getText().charAt(i) == characters.get(i).getText().charAt(0)) 
         { 
          characters.get(i).setFill(Color.GREEN);//If chars at given index are equal set to green: exception - space 
          if(textarea.getText().charAt(i)== '_')//Your text charters can not be char underscore by default. If so this will screw up. 
          {//if underscore is type make the space red even though it equals the red underscore 
           characters.get(i).setText("_"); 
           characters.get(i).setFill(Color.RED); 
          } 
          else if(characters.get(i).getText().equals("_") && characters.get(i).getFill().equals(Color.RED)) 
          {//if the text object was changed to underscore and the textarea char is now a space, change the text object back to space 
           if(textarea.getText().charAt(i) == ' ') 
           { 
            characters.get(i).setText(" "); 
           }         
          } 
         }       
         else//if the characters at the given index are not equal, set the text object at that index to red 
         {        
          if(characters.get(i).getText().equals(" ")) 
          { 
           characters.get(i).setText("_"); 
          } 
          characters.get(i).setFill(Color.RED); 
         } 
        } 
        else//handle when index i is greater than or equally to the number of characters typed in the text area 
        { 
         characters.get(i).setFill(Color.BLACK);//set the text object at given index to black if the hasn't been enough charaters type to reach this index 
         if(characters.get(i).getText().equals("_")) 
         { 
          characters.get(i).setText(" "); 
         } 
        } 
       } 
      } 
     }); 


     HBox hbox = new HBox();//holds text objects 
     hbox.getChildren().addAll(characters);//add text objects to hbox 
     VBox root = new VBox();//holds hbox and textarea 
     root.getChildren().addAll(hbox, textarea);//add hbox. add textarea 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

注:あなたの文字列のテキストは下線文字 '_' を含めることはできません。もしそうなら、それは常に赤くなるでしょう。

関連する問題