使用JavaFx创建一个黑暗模式

时间:2018-03-07 18:53:58

标签: javafx scenebuilder

我想知道是否有一种使用JavaFx和CSS制作黑暗模式的简单方法。我有一个带有CheckMenuItem的MenuBar,名为' Dark mode'当我点击它时,我希望场景变暗,文字变成白色。

4 个答案:

答案 0 :(得分:3)

自从我玩“主题”JavaFX应用程序以来已经有一段时间了,但是从前不久我有一个CSS文件:

.root {
    -fx-base: #3f474f;
    -fx-accent: #e7eff7 ;
    -fx-default-button: #7f878f ;
    -fx-focus-color: #efefef;
    -fx-faint-focus-color: #efefef22;
    -fx-focused-text-base-color : ladder(
            -fx-selection-bar,
            -fx-light-text-color 45%,
            -fx-dark-text-color 46%,
            -fx-dark-text-color 59%,
            -fx-mid-text-color 60%
        );
    -fx-focused-mark-color : -fx-focused-text-base-color ;   

}

.text-input:focused {
    -fx-highlight-text-fill: ladder(
        -fx-highlight-fill,
        -fx-light-text-color 45%,
        -fx-dark-text-color  46%,
        -fx-dark-text-color  59%,
        -fx-mid-text-color   60%
    );
}

如果你把它放在一个文件中,比如dark-theme.css,你就可以

checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
    if (isSelected) {
        scene.getStyleSheets().add("dark-theme.css");
    } else {
        scene.getStyleSheets().remove("dark-theme.css");
    }
});

答案 1 :(得分:1)

这是我的

.root { 
    -fx-accent: #1a6ee4;
    -fx-focus-color: -fx-accent;
    -fx-base: #111;
    -fx-control-inner-background: derive(-fx-base,50%);
    -fx-control-inner-background-alt: derive(-fx-control-inner-background, 30%);
}

.label{
    -fx-text-fill: lightgray;
}

.separator *.line { 
    -fx-background-color: #3C3C3C;
    -fx-border-style: solid;
    -fx-border-width: 1px;
}

.scroll-bar{
    -fx-background-color: derive(-fx-base,45%)
}

.button:default {
    -fx-base: -fx-accent ;
} 

.table-view{
    -fx-background-color: derive(-fx-base, 10%);
    -fx-selection-bar-non-focused: derive(-fx-base, 85%);
}

.table-view .column-header .label{
    -fx-font-weight: none;
}

.combo-table-view{/*optional */
    /*i only use this style when a table-view has to emulate a combo-box or auto-complete look, by making the non focused color same as the focused one*/
    -fx-selection-bar: -fx-accent;
    -fx-selection-bar-non-focused: -fx-accent;
}

.table-row-cell:even{
    -fx-control-inner-background: derive(-fx-base, 23%);
}

.table-row-cell:odd{
    -fx-control-inner-background: derive(-fx-base, 0%);
}

.table-row-cell:empty {
    -fx-background-color: transparent;
}

enter image description here

答案 2 :(得分:0)

我是 javafx 的新手,但我很确定创建 2 个样式表并在它们之间切换就足够了。

再说一遍,如果我说的是错误的,对不起,我是 javafx 的新手

答案 3 :(得分:-1)

属性库可以应用于每个javaFx类型,这使得可以使用单个基本颜色为JavaFx节点或布局...指定颜色主题,并且具有基于其计算的变体颜色(对于它的子项)。基色!

在这种情况下,您正在尝试为整个场景设置主题,因此您应该将基色应用于层次结构中的最高组件,您可以通过获取场景的根节点来获得该组件!

new Vue({
  el: 'main',
  data: {
    playing: false
  },
  computed: {
    paused() {
      return !this.playing;
    }
  },
  directives: {
    play: {
      bind(el, binding, vnode) {
        el.addEventListener('playing', () => {
          vnode.context[binding.expression] = !el.paused;
        });
        el.addEventListener('pause', () => {
          vnode.context[binding.expression] = !el.paused;
        });
        vnode.context[binding.expression] = !el.paused;
      },
      update(el, binding) {
        if (el.paused) {
          if (binding.value) {
            el.play();
          }
        } else if (!binding.value) {
          el.pause();
        }
      }
    }
  },
  methods: {
    play() {
      this.playing = true;
    },
    pause() {
      this.playing = false;
    }
  }
});