2017-06-28 4 views
2

現在、コマンドシェルと同様に動作するアプリケーションを構築しようとしています。私はjavaFXテキストフィールドにユーザの入力テキストの前に私が与えたパス(または少なくとも '>'文字)を表示したいと思います。このように:ユーザーがテキストを送信するときに、テキストフィールドがクリアされるようにJavaFXテキストフィールドにテキストを入力する前に削除不可能なテキストを表示

enter image description here

私はそれを持っています。提出後、同様の効果を得るためにフィールドのテキストを自分のパスに設定しますが、ユーザーはテキストを入力している間もこのパスを削除できます。

パスのテキストがフィールドに表示されるようにするにはどうすればよいですか?ユーザーはそれを削除できません。

私はこれを試してみたが、それは唯一の提出後、キャレット位置が更新されます

 textField.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      textField.positionCaret(textField.getLength()); 
     } 
    }); 
+0

これは役立つはず:その質問へのhttps://stackoverflow.com/questions/19167750/control-keyboard-input-into-javafx-textfield – Oswald

+0

@Oswaldの回答かなり古くなっており、 'TextFormatter'を使って、現在サポートされているこのようなやり方を含んでいません。 –

答えて

3

あなたがテキストフィールドに無効な操作をフィルタリングするためにTextFormatterを使用することができます。 TextFormatterには、テキストフィールドの変更をフィルタリングするフィルタがあります。フィルタにnullを返すことで、変更を拒否できます。例えば(

UnaryOperator<TextFormatter.Change> filter = c -> { 
    if (c.getCaretPosition() < prefix.length() || c.getAnchor() < prefix.length()) { 
     return null ; 
    } else { 
     return c ; 
    } 
}; 

textField.setTextFormatter(new TextFormatter<String>(filter)); 

あなたがここに他のロジックを試すことができます:あなたが記述何のための最も簡単な実装では、単にキャレット位置やテキストフィールドのアンカーは、固定テキストの終わりの前にいたすべての変更を除外しますユーザーが固定テキストを選択できるようにする場合)。ここで

はSSCCEです:

import java.util.function.UnaryOperator; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextFormatter; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class TextFieldFixedPrefix extends Application { 

    private TextField createFixedPrefixTextField(String prefix) { 
     TextField textField = new TextField(prefix); 

     UnaryOperator<TextFormatter.Change> filter = c -> { 
      if (c.getCaretPosition() < prefix.length() || c.getAnchor() < prefix.length()) { 
       return null ; 
      } else { 
       return c ; 
      } 
     }; 

     textField.setTextFormatter(new TextFormatter<String>(filter)); 

     textField.positionCaret(prefix.length()); 

     return textField ; 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     TextField textField = createFixedPrefixTextField("/home/currentUser $ "); 
     StackPane root = new StackPane(textField); 
     Scene scene = new Scene(root, 300,40); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
関連する問題