如何在 javaFX 中从不同的 class 更改窗格颜色
How to change a pane color from a different class in javaFX
我根据用户在文本框中输入的操作进行了一些输入验证。我希望它在输入字母时变成橙色,在输入数字时变成白色。我遇到的问题是,一旦应用程序意识到它是数字或字母,我就想不出改变颜色的方法。
我需要它来获取用户的输入,查看 TypedKey class 然后查看 if、else if 并根据它更改场景中的颜色。这是我能想到的最合乎逻辑的方式,但如果有人知道更有效的方式,或者可以帮助我改进我认为的方式,将不胜感激。
@Override
public void start(Stage primaryStage) throws Exception {
GridPane pane = new GridPane();
pane.setHgap(5);
pane.setVgap(5);
pane.setAlignment(Pos.CENTER);
Scene scene = new Scene(pane, 300, 200);
pane.add(new Label("Salary and Wage"), 0, 0);
pane.add(tfSalaryAndWage, 1, 0);
pane.add(btOK, 1, 1);
//Red color for tfSalary box
Color redColor = Color.rgb( 255, 0 , 0, 0.5);
BackgroundFill backgroundFill = new BackgroundFill(redColor, null, null);
Background background= new Background(backgroundFill);
tfSalaryAndWage.setBackground(background);
TypedKey typedKeyHandler = new TypedKey(this);
tfSalaryAndWage.setOnKeyTyped(typedKeyHandler);
primaryStage.setScene(scene);
primaryStage.setTitle("Loan Calculator");
primaryStage.show();
}
输入验证class
class TypedKey implements EventHandler<KeyEvent> {
ValidateDataTest formObj = null; // Declare a data member to represent an
// object of the form class.
Color blueBackgroundColor = null;
public TypedKey(ValidateDataTest formObj) // This constructor receives an
// object of the form class.
{
this.formObj = formObj;
}
public void handle(KeyEvent e) {
if ((e.getCharacter().compareTo("a") >= 0 && e.getCharacter()
.compareTo("z") <= 0)
|| (e.getCharacter().compareTo("A") >= 0 && e.getCharacter()
.compareTo("Z") <= 0)) {
System.out.println("LOOKS LIKE A Z WAS PRESSED");
}
else if ((e.getCharacter().compareTo("0") >= 0 && e.getCharacter()
.compareTo("9") <= 0)) {
System.out.println("LOOKS LIKE NUMBERS WERE PRESSED");
}
}
}
您的要求不需要单独的 class。文本字段 textProperty()
上的一个简单更改侦听器应该就足够了。
textField.textProperty().addListener((ob, oldValue, newValue) -> {
if (isNumeric(newValue)) {
scene.setFill(Color.AQUA);
} else {
scene.setFill(Color.FIREBRICK);
}
});
其中,isNumeric()
只是我写的一个私有方法
private boolean isNumeric(String str) {
for(Character ch : str.toCharArray()){
if(Character.isAlphabetic(ch)){
return false;
}
}
return true;
}
MVCE
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class TextFieldBindSceneColor extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
TextField textField = new TextField();
VBox box = new VBox(textField);
box.setAlignment(Pos.CENTER);
box.setStyle("-fx-background-color: transparent");
Scene scene = new Scene(box, 200, 200);
textField.textProperty().addListener((ob, oldValue, newValue) -> {
if (isNumeric(newValue)) {
scene.setFill(Color.AQUA);
} else {
scene.setFill(Color.FIREBRICK);
}
});
//scene.setFill(Color.RED);
primaryStage.setScene(scene);
primaryStage.show();
}
private boolean isNumeric(String str) {
for(Character ch : str.toCharArray()){
if(Character.isAlphabetic(ch)){
return false;
}
}
return true;
}
}
我根据用户在文本框中输入的操作进行了一些输入验证。我希望它在输入字母时变成橙色,在输入数字时变成白色。我遇到的问题是,一旦应用程序意识到它是数字或字母,我就想不出改变颜色的方法。
我需要它来获取用户的输入,查看 TypedKey class 然后查看 if、else if 并根据它更改场景中的颜色。这是我能想到的最合乎逻辑的方式,但如果有人知道更有效的方式,或者可以帮助我改进我认为的方式,将不胜感激。
@Override
public void start(Stage primaryStage) throws Exception {
GridPane pane = new GridPane();
pane.setHgap(5);
pane.setVgap(5);
pane.setAlignment(Pos.CENTER);
Scene scene = new Scene(pane, 300, 200);
pane.add(new Label("Salary and Wage"), 0, 0);
pane.add(tfSalaryAndWage, 1, 0);
pane.add(btOK, 1, 1);
//Red color for tfSalary box
Color redColor = Color.rgb( 255, 0 , 0, 0.5);
BackgroundFill backgroundFill = new BackgroundFill(redColor, null, null);
Background background= new Background(backgroundFill);
tfSalaryAndWage.setBackground(background);
TypedKey typedKeyHandler = new TypedKey(this);
tfSalaryAndWage.setOnKeyTyped(typedKeyHandler);
primaryStage.setScene(scene);
primaryStage.setTitle("Loan Calculator");
primaryStage.show();
}
输入验证class
class TypedKey implements EventHandler<KeyEvent> {
ValidateDataTest formObj = null; // Declare a data member to represent an
// object of the form class.
Color blueBackgroundColor = null;
public TypedKey(ValidateDataTest formObj) // This constructor receives an
// object of the form class.
{
this.formObj = formObj;
}
public void handle(KeyEvent e) {
if ((e.getCharacter().compareTo("a") >= 0 && e.getCharacter()
.compareTo("z") <= 0)
|| (e.getCharacter().compareTo("A") >= 0 && e.getCharacter()
.compareTo("Z") <= 0)) {
System.out.println("LOOKS LIKE A Z WAS PRESSED");
}
else if ((e.getCharacter().compareTo("0") >= 0 && e.getCharacter()
.compareTo("9") <= 0)) {
System.out.println("LOOKS LIKE NUMBERS WERE PRESSED");
}
}
}
您的要求不需要单独的 class。文本字段 textProperty()
上的一个简单更改侦听器应该就足够了。
textField.textProperty().addListener((ob, oldValue, newValue) -> {
if (isNumeric(newValue)) {
scene.setFill(Color.AQUA);
} else {
scene.setFill(Color.FIREBRICK);
}
});
其中,isNumeric()
只是我写的一个私有方法
private boolean isNumeric(String str) {
for(Character ch : str.toCharArray()){
if(Character.isAlphabetic(ch)){
return false;
}
}
return true;
}
MVCE
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class TextFieldBindSceneColor extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
TextField textField = new TextField();
VBox box = new VBox(textField);
box.setAlignment(Pos.CENTER);
box.setStyle("-fx-background-color: transparent");
Scene scene = new Scene(box, 200, 200);
textField.textProperty().addListener((ob, oldValue, newValue) -> {
if (isNumeric(newValue)) {
scene.setFill(Color.AQUA);
} else {
scene.setFill(Color.FIREBRICK);
}
});
//scene.setFill(Color.RED);
primaryStage.setScene(scene);
primaryStage.show();
}
private boolean isNumeric(String str) {
for(Character ch : str.toCharArray()){
if(Character.isAlphabetic(ch)){
return false;
}
}
return true;
}
}