java awt 颜色选择器在 JavaFx 中没有以正确的方式显示
java awt color chooser does't show in proper way in JavaFx
@FXML
Private void handleItemBackAction(ActionEvent eve)
{
java.awt.Color color=JColorChooser.showDialog(null,"Select a color",java.awt.Color.CYAN);
String hex = Integer.toHexString(color.getRGB() & 0xffffff);
hex="#"+hex;
Text.setText(hex);
ShortcutButton.setStyle("-fx-background-color: " + hex + ";");
}
当我 运行 这个 window 并单击按钮时,颜色选择器第一次出现在我实际的窗格后面。
当我在 运行ning 时第二次单击按钮时,它显示在所有其他窗格的顶部,这是正确的,依此类推,它可以正常工作。
那为什么第一次点击按钮时颜色选择器没有显示在前面?
JColorChooser.showDialog 的第一个参数是对话框的父组件。您告诉该方法显示没有父级的对话框,因此它不知道您的其他 windows.
您需要在 JavaFX 对话框或 window 中嵌入 JColorChooser instance,而不是使用 JColorChooser.showDialog:
JColorChooser colorChooser = new JColorChooser(java.awt.Color.CYAN);
SwingNode colorChooserNode = new SwingNode();
colorChooserNode.setContent(colorChooser);
Alert dialog = new Alert(Alert.AlertType.NONE);
// Guarantees dialog will be above (and will block input to) mainStage.
dialog.initOwner(mainStage);
dialog.setTitle("Select a color");
dialog.getDialogPane().setContent(colorChooserNode);
dialog.getDialogPane().getButtonTypes().setAll(
ButtonType.OK, ButtonType.CANCEL);
Optional<ButtonType> response = dialog.showAndWait();
if (response.filter(r -> r == ButtonType.OK).isPresent()) {
int rgb = colorChooser.getColor().getRGB();
String hex = String.format("#%06x", rgb & 0xffffff);
Text.setText(hex);
ShortcutButton.setBackground(new Background(
new BackgroundFill(Color.valueOf(hex), null, null)));
} else {
System.out.println("User canceled");
}
当然,您最好在主 window 中使用 ColorPicker,这样您根本不必创建显式对话框:
final ColorPicker colorPicker = new ColorPicker(Color.CYAN);
colorPicker.setOnAction(e -> {
Color color = colorPicker.getValue();
String hex = String.format("#%02x02x02x",
(int) (color.getRed() * 255),
(int) (color.getGreen() * 255),
(int) (color.getBlue() * 255));
Text.setText(hex);
ShortcutButton.setBackground(
new Background(new BackgroundFill(color, null, null)));
});
myLayoutPane.getChildren().add(colorPicker);
顺便说一句,Java 变量名应始终以小写字母开头,以便于与 class 名称区分开来。考虑将 Text 更改为 text
,将 ShortcutButton 更改为 shortcutButton
.
@FXML
Private void handleItemBackAction(ActionEvent eve)
{
java.awt.Color color=JColorChooser.showDialog(null,"Select a color",java.awt.Color.CYAN);
String hex = Integer.toHexString(color.getRGB() & 0xffffff);
hex="#"+hex;
Text.setText(hex);
ShortcutButton.setStyle("-fx-background-color: " + hex + ";");
}
当我 运行 这个 window 并单击按钮时,颜色选择器第一次出现在我实际的窗格后面。
当我在 运行ning 时第二次单击按钮时,它显示在所有其他窗格的顶部,这是正确的,依此类推,它可以正常工作。
那为什么第一次点击按钮时颜色选择器没有显示在前面?
JColorChooser.showDialog 的第一个参数是对话框的父组件。您告诉该方法显示没有父级的对话框,因此它不知道您的其他 windows.
您需要在 JavaFX 对话框或 window 中嵌入 JColorChooser instance,而不是使用 JColorChooser.showDialog:
JColorChooser colorChooser = new JColorChooser(java.awt.Color.CYAN);
SwingNode colorChooserNode = new SwingNode();
colorChooserNode.setContent(colorChooser);
Alert dialog = new Alert(Alert.AlertType.NONE);
// Guarantees dialog will be above (and will block input to) mainStage.
dialog.initOwner(mainStage);
dialog.setTitle("Select a color");
dialog.getDialogPane().setContent(colorChooserNode);
dialog.getDialogPane().getButtonTypes().setAll(
ButtonType.OK, ButtonType.CANCEL);
Optional<ButtonType> response = dialog.showAndWait();
if (response.filter(r -> r == ButtonType.OK).isPresent()) {
int rgb = colorChooser.getColor().getRGB();
String hex = String.format("#%06x", rgb & 0xffffff);
Text.setText(hex);
ShortcutButton.setBackground(new Background(
new BackgroundFill(Color.valueOf(hex), null, null)));
} else {
System.out.println("User canceled");
}
当然,您最好在主 window 中使用 ColorPicker,这样您根本不必创建显式对话框:
final ColorPicker colorPicker = new ColorPicker(Color.CYAN);
colorPicker.setOnAction(e -> {
Color color = colorPicker.getValue();
String hex = String.format("#%02x02x02x",
(int) (color.getRed() * 255),
(int) (color.getGreen() * 255),
(int) (color.getBlue() * 255));
Text.setText(hex);
ShortcutButton.setBackground(
new Background(new BackgroundFill(color, null, null)));
});
myLayoutPane.getChildren().add(colorPicker);
顺便说一句,Java 变量名应始终以小写字母开头,以便于与 class 名称区分开来。考虑将 Text 更改为 text
,将 ShortcutButton 更改为 shortcutButton
.