'com.sun.javafx.scene.control.skin.ComboBoxBaseSkin' 中没有定义有效的构造函数

No valid constructor defined in 'com.sun.javafx.scene.control.skin.ComboBoxBaseSkin'

我目前正在研究库存管理系统。在应用程序上更改场景时,我收到以下错误。仅当该屏幕包含组合框时才会显示错误,该组合框是下图中显示的大多数屏幕。

一切正常,但出现以下错误。我相信这与 CSS 中的 CSS 组合框样式有关。

与 CSS 有关的先前错误的背景:最初我在查找 CSS 的文件时遇到问题,并收到错误 null/styles.css。我通过将以下 stylesheets="@style.css" 更改为 stylesheets="/stock/style.css" 来解决这个问题。不确定这是否会影响我认为我会提及它以防它与此有关,即使在更改之前错误仍然存​​在。

May 19, 2020 6:31:50 PM javafx.scene.control.Control loadSkinClass
SEVERE: No valid constructor defined in 'com.sun.javafx.scene.control.skin.ComboBoxBaseSkin' for control ComboBox[id=comboStatus, styleClass=combo-box-base combo-box].
You must provide a constructor that accepts a single Skinnable (e.g. Control or PopupControl) parameter in com.sun.javafx.scene.control.skin.ComboBoxBaseSkin.

CSS 如下:

.combo-box .list-cell {

    -fx-background: #2D75E8;
    -fx-background-color: transparent;
    -fx-text-fill: white;
    -fx-padding: 3 0 2 7;
    -fx-cell-size: 1.96667em;
    -fx-font-weight: bold;
}

.combo-box .list-view .list-cell {

    -fx-text-fill: white;
    -fx-font-weight: bold;
}

.combo-box-popup .list-view {

    -fx-background-color: #2D75E8, #2D75E8;
    -fx-background-insets: 0, 1;
    -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.6), 8, 0.0, 0, 0);
    -fx-font-weight: bold;
}

.combo-box-popup .list-view .list-cell {

    -fx-padding: 4 0 4 5;
    -fx-font-weight: bold;
    /* No alternate highlighting */
    -fx-background-color: #2D75E8;
}

.combo-box-popup .list-view .list-cell:filled:selected, .combo-box-popup .list-view .list-cell:filled:selected:hover {

    -fx-background: -fx-accent;
    -fx-background-color: -fx-selection-bar;
    -fx-text-fill: white;
}

.combo-box-popup .list-view .list-cell:filled:hover {

    -fx-background-color: #2D75E8;
    -fx-text-fill: white;
    -fx-font-weight: bold;
}

.combo-box-base {

    -fx-skin: "com.sun.javafx.scene.control.skin.ComboBoxBaseSkin";
    -fx-background-color: #2D75E8, #2D75E8, #2D75E8, #2D75E8;
    -fx-background-radius: 5, 5, 4, 3;
    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
    -fx-padding: 0;
    -fx-font-weight: bold;
}

.combo-box-base:hover {

    -fx-color: -fx-hover-base;
}

.combo-box-base:showing {

    -fx-color: -fx-pressed-base;
}

我在某些屏幕上也遇到 CSS 解析错误,如下所示:

May 19, 2020 7:08:55 PM com.sun.javafx.css.parser.CSSParser declaration
WARNING: CSS Error parsing '*{-fx-text-inner-color: #3f5cc3; -fx-font-weight: 15px;}: Expected '<font-weight>' while parsing '-fx-font-weight' at [1,50]

我不太明白它要我如何格式化它,即使错误显示的是预期的。为什么需要 '<font-weight>'?

以下是应用程序本身的一些屏幕截图:

你有:

.combo-box-base {

    -fx-skin: "com.sun.javafx.scene.control.skin.ComboBoxBaseSkin";
    -fx-background-color: #2D75E8, #2D75E8, #2D75E8, #2D75E8;
    -fx-background-radius: 5, 5, 4, 3;
    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
    -fx-padding: 0;
    -fx-font-weight: bold;
}

这是您的错误来源。具体来说:

-fx-skin: "com.sun.javafx.scene.control.skin.ComboBoxBaseSkin";

这是告诉 JavaFX 使用指定的 class 作为 Skin 实现,用于所有具有 .combo-box-base 样式 class 的控件。 属性 的目的是用定制的 Control 覆盖 the default skin。使用自定义皮肤可以改变 JavaFX 应用程序的外观。但是,您的 CSS 指定 ComboBoxBaseSkin 这至少出于以下三个原因很奇怪:

  1. 它是一个抽象 class,因此不能直接使用。
  2. ComboBox默认皮肤ComboBoxPopupControl.
  3. 的直接superclass
  4. 这是一个内部 class(即私有 API)。您不应直接依赖内部 API,因为它可能会更改,恕不另行通知。举个例子,默认皮肤在 JavaFX 9 中变为 public API 并移动到不同的包;如果它一开始就可以正常工作,那将破坏您的应用程序。

最终错误来自于 ComboBoxBaseSkin 的构造函数带有 ComboBoxBase 参数,而不是 ComboBox 参数(CSS 似乎在寻找 完全匹配)。

解决方案似乎是简单地从您的 CSS 中删除 -fx-skin 属性 并让 ComboBox 使用其默认皮肤。或者,如果您实际上正在尝试使用自定义皮肤,请使用自定义皮肤的完全限定名称 class 作为值。


至于你的解析错误,-fx-font-weight 期望值是 weight,@James_D 在问题评论中已经指出。如果要更改大小,请使用 -fx-font-size。您可以查看 JavaFX CSS Reference Guide 以了解有关 JavaFX 的更多信息-CSS.