Я обнаружил проблему после просмотра вашего кода и других примеров javafx из oracle. Проблема сводится к тому, что вы не можете изменить свои собственные переменные CSS из setStyle. Из метода setStyle вы можете переопределить только свойства css, доступные в caspian.css , который является стандартным java css. (Строка 802 для свойств меню, а затем строка меню).
Самое простое решение, которое можно сделать здесь, это вызвать правильное свойство из setStyle:
Проблема:
public void setMenuBarColor(String color){
menuBar.setStyle("-fx-my-menu-color-highlighted: " + color + ";");
}
Fix:
public void setMenuBarColor(String color){
menuBar.setStyle("-fx-background-color: " + color + ";");
}
Вы можете комбинировать как setStyle, так и используя файл css, просто убедитесь, что вы не задали свойства для одного и того же селектора.
Ниже приведен краткий пример:
MenuExample.java
package sample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class MenuExample extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("JavaFX App");
Menu menu1 = new Menu("Menu 1");
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu1);
//menuBar.setStyle("-fx-background-color: #6601C6;"); //uncomment to use this instead of css
//menu1.setStyle("-fx-background-color: #FF7F11;");
VBox vBox = new VBox(menuBar);
Scene scene = new Scene(vBox, 960, 600);
scene.getStylesheets().add("sample/sample-menu.css"); // comment here if using setStyle
primaryStage.setScene(scene);
primaryStage.show();
}
}
образец-menu.css
/* VARIABLE DEFINITIONS: Only these 4 variables have to be adjusted, the rest is copy-paste */
* {
-fx-my-menu-color: #00ff00; /* Change according to your needs */
-fx-my-menu-color-highlighted: #FF7F11; /* Change according to your needs */
-fx-my-menu-font-color: #FFFFFF; /* Change according to your needs */
-fx-my-menu-font-color-highlighted: #FFFFFF; /* Change according to your needs */
}
/* Try this: Comment .menu below and use menu1.setStyle from MenuExample.java */
.menu {
-fx-background-color: #FF7F11;
}
/* MENU BAR + Top-level MENU BUTTONS */
/*** The menu bar itself ***/
.menu-bar {
-fx-background-color: -fx-my-menu-color;
}
/* CONTEXT MENU */
/*** The context menu that contains a menu's menu items ***/
.context-menu {
-fx-background-color: -fx-my-menu-color;
}
Существует способ установить переменные CSS с помощью псевдокласса, но я думаю, что для того, что вы здесь делаете, просто имеет смысл изменить этот метод. Я никогда не использовал peudoclass, поэтому не могу сказать, как он будет работать после загрузки CSS во время выполнения.
Ссылки
SO: Как установить стили
SO: PseudoClass