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.