2016-04-05 28 views
1

我正在使用JavaFX 8,並具有一個只讀的TextArea,它根據具體情況顯示確認消息或錯誤消息。我希望確認消息具有黑色文本,但我希望錯誤消息具有紅色文本。我如何在JavaFX 8中做到這一點?目前,我寧願以編程的方式進行,但我肯定會對如何在FXML中完成此項任務以及該程序的下一個草稿感興趣。如何動態更改JavaFX TextArea中文本的前景色?

本質上,我顯示一個tableView並讓用戶編輯TableView的單元格中的信息。如果用戶在單元格中輸入了一個無效值,我想給他/她一個關於錯誤的明確錯誤信息,並且我希望該信息是紅色的(或以某種方式突出顯示)。如果他們以可接受的方式更改值,我需要一條確認消息,告訴他們已經在表和數據庫中成功更改了值;我寧願那個消息是黑色的(或類似的)。

我對JavaFX相當陌生,很驚訝地發現沒有setForeground()。我們現在應該怎麼做?或者我應該使用某種HTML字段?我還沒有玩過那些......

================================== ===================================== 後續問題

我可能誤解了意圖James_D的答案,但我創建了兩個僞類,一個錯誤消息和一個報告消息:

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()。

+0

如果您希望黑色和紅色文本同時出現在文本區域中,則無法使用文本區域。也許考慮使用['HTMLEditor'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/web/HTMLEditor.html)。如果你只需要一個或另一個,使用'setStyle(...)'。澄清我可以提供更完整的答案。 –

+0

我一次只需要一種前景色。至少這是我最初的概念;這可能會改變。 – Henry

+0

您是否每次切換僞類都關閉?雖然這種方法可行,但它可能過於複雜。如果只有兩種可能性,你只需要一個僞類。您需要的兩個CSS選擇器是'.text-area {}'和'.text-area:error {。 }'。如果有兩種以上的可能性,那麼你可能需要更多的僞類,但是你的邏輯必須確保所有的僞類狀態都被設置爲正確的值。 –

回答

1

在JavaFX中,您使用CSS控制樣式控件。推薦的方法是使用外部樣式表,它將樣式(在CSS文件中)和邏輯(在Java中)分開。您也可以通過在控件上直接調用setStyle(...)來使用「內聯」風格。

根據CSS documentationTextArea有一個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:red」)。如果我把這兩行分開,只有後面的一行纔會生效。現在我要去嘗試更好的方式...... – Henry

+0

是的,當然。如果多次設置樣式,則樣式將保留您設置的最後一個值,就像設置其他屬性一樣。如果您有多個樣式屬性可供設置,您幾乎可以肯定會這樣做,那麼更新僞類並將所有樣式設置委託給CSS文件將會更清晰。 –

+0

我想要的首選方法,它*幾乎*的作品,但不完全。我將在此頁面的其他地方詳細描述更大的問題,但更小的問題是我的CSS中有兩個樣式更改,將填充顏色更改爲紅色,將字體權重更改爲700以獲取錯誤,並返回黑色/正常獲取信息消息。但是,字體權重似乎被忽略,儘管它遵循正常的CSS編碼規則。爲什麼會這樣?代碼如下:.text-area:error { -fx-text-fill:red; -fx-font-weight:700; } – Henry

相關問題