'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
这至少出于以下三个原因很奇怪:
- 它是一个抽象 class,因此不能直接使用。
- 是
ComboBox
默认皮肤ComboBoxPopupControl
. 的直接superclass
- 这是一个内部 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.
我目前正在研究库存管理系统。在应用程序上更改场景时,我收到以下错误。仅当该屏幕包含组合框时才会显示错误,该组合框是下图中显示的大多数屏幕。
一切正常,但出现以下错误。我相信这与 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
这至少出于以下三个原因很奇怪:
- 它是一个抽象 class,因此不能直接使用。
- 是
ComboBox
默认皮肤ComboBoxPopupControl
. 的直接superclass
- 这是一个内部 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.