我有兴趣在拖动主舞台或窗口时如何隐藏上下文菜单?我正在研究这个Validator示例,我注意到几个与Java 8中的Context Menu相关的问题
public class MainApp extends Application
{
@Override
public void start(Stage stage) throws Exception
{
// setUserAgentStylesheet(STYLESHEET_CASPIAN);
stage.setTitle("Validation Demo");
BorderPane borderPane = new BorderPane();
borderPane.setCenter(loadLoginScreen());
Scene scene = new Scene(borderPane, 700, 500);
scene.getStylesheets().add(
MainApp.class.getResource("/styles/validator.css")
.toExternalForm());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args)
{
launch(args);
}
private GridPane loadLoginScreen()
{
GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(25, 25, 25, 25));
Text scenetitle = new Text("Welcome");
scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
grid.add(scenetitle, 0, 0, 2, 1);
Label userName = new Label("User Name:");
grid.add(userName, 0, 1);
final TextField userTextField = new TextField();
grid.add(userTextField, 1, 1);
Label pw = new Label("Password:");
grid.add(pw, 0, 2);
final PasswordField pwBox = new PasswordField();
grid.add(pwBox, 1, 2);
Button btn = new Button("Sign in");
HBox hbBtn = new HBox(10);
hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
hbBtn.getChildren().add(btn);
grid.add(hbBtn, 1, 4);
final Text actiontarget = new Text();
grid.add(actiontarget, 1, 6);
// Context Menu for error messages
final ContextMenu usernameValidator = new ContextMenu();
usernameValidator.getStyleClass().add("validator");
usernameValidator.setAutoHide(false);
final ContextMenu passValidator = new ContextMenu();
passValidator.getStyleClass().add("validator");
passValidator.setAutoHide(false);
// Action on button press
btn.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
// Clearing message if any
actiontarget.setText("");
// Checking if the userTextField is empty
if (userTextField.getText().equals(""))
{
MenuItem cc = new MenuItem("Please enter username");
cc.getStyleClass().add("validator-item");
usernameValidator.getItems().clear();
usernameValidator.getItems().add(cc);
usernameValidator.show(userTextField, Side.RIGHT, 10, 0);
}
// Checking if the pwBox is empty
if (pwBox.getText().equals(""))
{
MenuItem dcc = new MenuItem("Please enter password");
dcc.getStyleClass().add("validator-item");
passValidator.getItems().clear();
passValidator.getItems().add(dcc);
passValidator.show(pwBox, Side.RIGHT, 10, 0);
}
// If both of the above textFields have values
if (!pwBox.getText().equals("")
&& !userTextField.getText().equals(""))
{
actiontarget.setFill(Color.GREEN);
actiontarget.setText("Welcome");
}
}
});
userTextField.focusedProperty().addListener(
new ChangeListener<Boolean>()
{
@Override
public void changed(
ObservableValue<? extends Boolean> arg0,
Boolean oldPropertyValue, Boolean newPropertyValue)
{
if (newPropertyValue)
{
// Clearing message if any
actiontarget.setText("");
// Hiding the error message
usernameValidator.hide();
}
}
});
pwBox.focusedProperty().addListener(new ChangeListener<Boolean>()
{
@Override
public void changed(ObservableValue<? extends Boolean> arg0,
Boolean oldPropertyValue, Boolean newPropertyValue)
{
if (newPropertyValue)
{
// Clearing message if any
actiontarget.setText("");
// Hiding the error message
passValidator.hide();
}
}
});
return grid;
}
}
validator.css
.validator {
-fx-background-color: #006699;
-fx-text-fill: white;
-fx-padding: 0;
}
.validator:hover {
-fx-background-color: #006699;
-fx-text-fill: white;
}
.validator-item .label {
-fx-text-fill: white;
}
.validator-item:focused .label {
-fx-text-fill: white;
}
例如,我可以为舞台添加事件处理程序吗?
答案 0 :(得分:1)
最简单的选择是打开自动隐藏,而不是像在代码中那样禁用它。那么你也不需要焦点属性监听器。