2017-11-06 33 views
0

私はJavaFXを使用しており、TextAreaを持っています。 textAreaでは、一度に1行しか選択できないようにするための方法が必要です。だから私の削除ボタンのために私がこれまで持っているものは:TextArea(JavaFX)で特定のテキスト選択を制御する方法は?

deleteButton.setOnAction(e -> { 
    String s = "DELETE: "; 
    s += receipt.getSelectedText(); 
    receipt.replaceSelection(s); 
}); 

一度に1行だけを選択できるようにするにはどうすればよいですか?それぞれの行にはブレーカとして\ nがありますので、キーとしてどのように使用するかを考えています。問題は、一度に複数の行を選択するユーザの能力または部分的な行である。そして、はい、私はtextAreaを使用する必要があります。私は今、削除ボタンが何を削除してそれを表示しているのかを読んでいます。私のコードのreadtは、この1つの問題でうまくいっています。私はボタンがクリックされたときにTextAreaをパラメータとして取り込むTextAreasを約15クラス用意して、それをTextAreaに追加し、指定されたオブジェクトに特定の属性として保存します。ハイライトコントロールやチェックボックスを追加する方法や、ユーザーがクリックして行全体をハイライト表示する方法を追加する必要があります(ただし、他の場所をクリックするとその行を強調表示/選択するか、自分自身を強調表示しようとします)それらをさせてください)。

+0

Hmm。 "私はすべての 'TextArea'をパラメータとして取り込む15のクラスを持っています..."これは*本当に*悪いデザインです。提示しているデータ(文字列の集合、テキストの行など)は、データの実際の表示(テキスト領域、または適切なコントロール)から分離する必要があります。問題(発見中)は、プレゼンテーションを変更したいと思っている場合です。ロジックのAPIが特定のUIに依存しているため、テキスト領域の代わりにリストビューを使用することはできません。これをリファクタリングして修正する方が、悪い設計に投資し続けるよりもはるかに優れています。 –

答えて

1

TextFormatterのフィルタを使用して、選択の変更を代行して変更することができます。

ここは簡単な例です。また、削除時に探している機能に実際に影響を与えるように変更を変更することもできます。

import java.util.function.UnaryOperator; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextFormatter; 
import javafx.scene.control.TextFormatter.Change; 
import javafx.stage.Stage; 

public class TextAreaSelectByLine extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TextArea textArea = new TextArea(); 
     UnaryOperator<Change> filter = c -> { 

      int caret = c.getCaretPosition(); 
      int anchor = c.getAnchor() ; 

      if (caret != anchor) { 
       int start = caret ; 
       int end = caret ; 
       String text = c.getControlNewText(); 
       while (start > 0 && text.charAt(start) != '\n') start-- ; 
       while (end < text.length() && text.charAt(end) != '\n') end++ ; 
       c.setAnchor(start); 
       c.setCaretPosition(end); 
      } 

      return c ; 
     }; 
     TextFormatter<String> formatter = new TextFormatter<>(filter); 
     textArea.setTextFormatter(formatter); 

     Scene scene = new Scene(textArea, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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