ChoiceBox背景颜色不会改变某些颜色

时间:2016-12-19 14:08:14

标签: java javafx

由于某种原因,某些颜色的背景颜色不会发生变化。对于"黄色"它没有变化。或" Pink"。我能想到的唯一原因是那些是AWT颜色,它使用的是代替JavaFX颜色,但我不确定为什么其他人不会这样做。

Here是问题和预期结果的图片

这是我改变ChoiceBox颜色的代码:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.collections.FXCollections;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Tooltip;
import javafx.stage.StageStyle;
import javafx.scene.paint.Color;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import java.text.DateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.util.Duration;
import java.io.InputStream;

    public class Clock extends Application {

        public Text text;

            @Override 
            public void start(Stage stage) {

                    DateFormat df = new SimpleDateFormat("EEE,MMM d yyyy - h:mm:ss a");
                    Date date = new Date();
                    String stringDate = df.format(date);

                    text = new Text(10, 60, stringDate);
                    Font font = null;

                    InputStream input = getClass().getResourceAsStream("/DIGITALDREAMFAT.ttf");

                    try {
                    font = Font.loadFont(input, 30); 
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    text.setFont(font);
                    text.setFill(Color.RED);


            Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0), new EventHandler<ActionEvent>() {

                    @Override
                    public void handle(ActionEvent actionEvent) {
                    Date update = new Date();
                    String stringNewDate = df.format(update);
                    text.setText(stringNewDate);
                    }
            }), new KeyFrame(Duration.seconds(1)));

            timeline.setCycleCount(Animation.INDEFINITE);
            timeline.play();

                    ChoiceBox colorChoice = new ChoiceBox(FXCollections.observableArrayList("Red", "Blue", "Green", "Yellow", "Pink", "Grey", "Black", "White"));

                    colorChoice.setOnAction(new EventHandler<ActionEvent>(){
                        public void handle(ActionEvent e) {
                            if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Red")) {
                            colorChoice.setStyle("-fx-base: red");
                            text.setFill(Color.RED);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Blue")) {
                            colorChoice.setStyle("-fx-base: blue");
                            text.setFill(Color.BLUE);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Green")) {
                            colorChoice.setStyle("-fx-base: green");
                            text.setFill(Color.GREEN);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Grey")) {
                            colorChoice.setStyle("-fx-base: grey");
                            text.setFill(Color.GREY);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("White")) {
                            colorChoice.setStyle("-fx-base: white");
                            text.setFill(Color.WHITE);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Black")) {
                            colorChoice.setStyle("-fx-base: black");
                            text.setFill(Color.BLACK);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Yellow")) {
                            colorChoice.setStyle("-fx-base: yellow");
                            text.setFill(Color.YELLOW);
                            } else if (colorChoice.getSelectionModel().getSelectedItem().toString().equals("Pink")) {
                            colorChoice.setStyle("-fx-base: pink");
                            text.setFill(Color.PINK);
                            } else {
                            colorChoice.setStyle("-fx-base: red");
                            text.setFill(Color.RED);
                            }
                        }
                    });

                    HBox hbox = new HBox(colorChoice);
                    Scene scene = new Scene(new Group(text, hbox));


                    hbox.setSpacing(10);

                    colorChoice.setTooltip(new Tooltip("Select Text Colour"));
                    colorChoice.getSelectionModel().selectFirst();


                    scene.setFill(Color.TRANSPARENT);

                    stage.setScene(scene);
                    stage.initStyle(StageStyle.TRANSPARENT);
                    stage.setX(0);
                    stage.setY(0);
                    stage.setWidth(710);
                    stage.setHeight(80);
                    stage.show(); 
            }

            public static void main(String[] args) {
                    launch(args);
            }
    }

2 个答案:

答案 0 :(得分:1)

下拉菜单的默认颜色是查找颜色-fx-control-inner-background:这反过来默认为-fx-base的非常轻的版本(比{{1}轻80% })。因此,如果您开始使用-fx-base的浅色(例如黄色),它将有效地完全变亮至接近白色。如果您将-fx-base替换为选项框,您将获得所需的效果。

请注意,您可以摆脱荒谬的-fx-control-inner-background构造,因为选择框中的所选项目包含您需要的所有信息。

if-else

答案 1 :(得分:0)

在这里你正在听控件本身而不是项目,并且不会发生变化,它总是通过else条件,所以当你点击控件时它会默认选择颜色红色(没有选择项目)所以如果你想改变所选项目的ChoiceBox颜色,请使用:

cb.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {

        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

            cb.setStyle("-fx-base:" + newValue.toLowerCase() + ";");


        }
    });

注意:这会根据所选项目而不是项目本身更改控件,如果有管理单元格属性的方法,我会感到惊讶!

祝你好运!