2016-04-05 48 views
1

私はJavaFX 8を使用しており、状況に応じて確認メッセージまたはエラーメッセージのいずれかを表示する読み取り専用TextAreaを持っています。私は確認メッセージに黒いテキストを付けるが、エラーメッセージには赤いテキストが必要だ。 JavaFX 8でどうすればいいですか?当面はプログラムで行う方が好きですが、プログラムの次のドラフトでも同様にFXMLでどのように行うことができるかに関心があります。JavaFX TextAreaのテキストの前景色を動的に変更するにはどうすればよいですか?

基本的に、私はのtableViewを表示し、ユーザ編集にテーブルビューのセル内の情報をさせるのです。ユーザーがセルに無効な値を入力した場合、何が間違っているのか明確なエラーメッセージを表示して、そのメッセージを赤色(または何らかの方法で強調表示)にしたいと考えています。彼らが許容可能な方法で値を変更する場合は、テーブルとデータベースで値を正常に変更したことを知らせる確認メッセージが必要です。私はそのメッセージが黒(または類似)であることを好むだろう。

私はJavaFXのにかなり新たなんだと何のsetForeground()、それ以上が存在しないことを知って驚いています。今、どうすればいいのですか?または、私は何らかのHTMLフィールドを使用する必要がありますか?私はそれらのまだ....

==================================でプレイしていません=================== フォローアップの質問

私は意図を誤解している可能性がありますJames_Dの答えのが、私は2つのpseudoclasses、エラーメッセージの1および情報メッセージのための1つの作成:私は単に、メッセージ、情報またはエラーのいずれかの種類を書くことができ、簡単な方法を持つことができることを望んでいた

private static final PseudoClass ERROR =        PseudoClass.getPseudoClass("error"); 

private static final PseudoClass INFO = PseudoClass.getPseudoClass("info"); 

をそのメソッドに擬似クラスを渡します。

writeMessage("This is an error message.", ERROR); 

および情報メッセージについては、このよう:エラーメッセージのために、次のように私は、メソッドを呼び出す

private void writeMessage(String message, PseudoClass pseudoClass) { 

    messageArea.pseudoClassStateChanged(pseudoClass, true); 
    messageArea.setText(message); 
} 

writeMessage("This is an information message.", INFO); 

そして、これは私が追加するものである。ここの方法です私のCSSファイルに:

.text-area:error { 
-fx-text-fill: red ; 
-fx-font-weight: 700; 
} 

.text-area:info { 
-fx-text-fill: black; 
-fx-font-weight: normal; 
} 

エラーメッセージが太字で表示されないのはなぜですか? (すべてのメッセージは通常のフォントで表示されます)。なぜ、いくつかのエラーメッセージが赤色で表示されないのはなぜですか?私は一貫して同じ方法でwriteMessage()を呼び出します。 JavaFXので

+0

テキストエリアに黒と赤のテキストが同時に表示されるようにするには、テキストエリアではできません。おそらく['HTMLEditor'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/web/HTMLEditor.html)の使用を検討してください。どちらか一方だけが必要な場合は、 'setStyle(...)'を使います。明確に私はより完全な答えを提供することができます。 –

+0

一度に1つの前景色が必要です。少なくともそれは私の最初の概念です。変化する可能性があります。 – Henry

+0

擬似クラスのいずれかを切り替えるごとにしますか?このアプローチはうまくいくかもしれませんが、おそらく過度に複雑です。 2つの可能性がある場合は、擬似クラスが1つだけ必要です。あなたが必要とする2つのCSSセレクタは '.text-area {}'と '.text-area:error {。 } '。 3つ以上の可能性がある場合は、より多くの疑似クラスが必要になるかもしれませんが、ロジックはすべての疑似クラス状態が正しい値に設定されていることを保証する必要があります。 –

答えて

1

、CSSを使用して、あなたのスタイルを制御します。推奨される方法は、スタイルシート(CSSファイル内)とロジック(Java)を分離する外部スタイルシートを使用することです。また、コントロールのsetStyle(...)を直接呼び出すことで、 "インライン"スタイルを使用することもできます。

CSS documentationによると、TextAreaは、表示されるテキストの色を定義するCSSプロパティ-fx-text-fillを持っています。

だから、「間に合わせ」の方法は次のようになります。

private TextArea messageArea ; 

// ... 

private void showMessage(String message, boolean error) { 
    if (error) { 
     messageArea.setStyle("-fx-text-fill: red ;") ; 
    } else { 
     messageArea.setStyle(""); 
    } 
    messageArea.setText(message); 
} 

より良いアプローチは、独自のCSS PseudoClassを定義し、その後、外部スタイルシートでそれを参照することです:

private static final PseudoClass ERROR = PseudoClass.getPsuedoClass("error"); 

private TextArea messageArea ; 

// ... 

private void showMessage(String message, boolean error) { 
    messageArea.pseudoClassStateChanged(ERROR, error); 
    messageArea.setText(message); 
} 

CSSファイルで、エラーメッセージのスタイル設定方法を定義できるようになりました:

.text-area:error { 
    -fx-text-fill: red ; 
} 

とtあなたはシーンにスタイルシートを添付することができます

Scene scene = ... ; 
scene.getStylesheets().add("path/to/css/file"); 
+0

ありがとうJames_D! 「迅速かつ汚れた」方法はすごく効果的です。私はほとんどあなたの以前の手掛かりからsetStyle()を使用するようになっていましたが、私の構文が少しずれてCSSが無視されました。また、setStyle()の引数に複数のディレクティブをセミコロンで区切って置くことができることを知ったところです。実際のCSSファイルと同じように、 messageArea.setStyle( " - fx-font-weight:700; -fx-text-fill:赤")。この2つの行を別々にすると、後の行だけが有効になります。今私はもっと良い方法を試してみよう... – Henry

+0

はい、もちろんです。スタイルを複数回設定すると、他のプロパティを設定するのと同様に、スタイルには最後に設定した値が保持されます。ほとんどの場合、設定するスタイルプロパティが複数ある場合は、疑似クラスを更新し、すべてのスタイル設定をCSSファイルに委譲する方がはるかにクリーンになります。 –

+0

私は好みの方法を試しています。私はこのページの他のところでより大きな問題を詳述しますが、小さな問題は、CSSで2つのスタイルを変更し、塗りつぶしの色をRedに変更し、font-weightを700に変更し、情報メッセージの黒/ 。しかし、通常のCSSコーディング規則に従っていても、font-weightは無視されているようです。それはなぜでしょうか?コードは次のとおりです。.text-area:error { -fx-text-fill:red; -fx-font-weight:700; } – Henry

関連する問題