当我试图一次设置 256 个 JavaFx 按钮的图形时,我遇到了一个非常奇怪的错误。我试图设置为按钮图形的节点是堆栈 Pane 。在我看来,由于同时设置如此多按钮的图形的繁重操作,应用程序有点耗尽了资源,但我不确定。 任何形式的建议都将受到高度赞赏。
错误日志如下:
java.lang.StackOverflowError
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.processCSS(Node.java:8725)
at javafx.scene.Node.applyCss(Node.java:8825)
at javafx.scene.Node.impl_processCSS(Node.java:8746)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:648)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.<init>(LabeledSkinBase.java:130)
at com.sun.javafx.scene.control.skin.ButtonSkin.<init>(ButtonSkin.java:44)
at javafx.scene.control.Button.createDefaultSkin(Button.java:191)
at javafx.scene.control.Control.impl_processCSS(Control.java:876)
代码片段如下:
自定义按钮类
public class CustomElementSlot extends Button { /** * Address of button. */ public Integer address; /** * Constructor. * @param addrss address */ public CustomElementSlot(final Integer addrss) { super(); this.address = addrss; } /** * Getter address. * @return address */ public final Integer getAddress() { return address; } /** * Setter of address. * @param address1 address */ public final void setAddress(final Integer address1) { this.address = address1; } }
用作上述按钮图形的自定义堆栈 Pane 类
public class ElementCustomNode extends StackPane implements Cloneable { private static final PseudoClass EDL_PSEUDO_CLASS = PseudoClass.getPseudoClass("edl"); private static final PseudoClass EDR_PSEUDO_CLASS = PseudoClass.getPseudoClass("edr"); private static final PseudoClass EDA_PSEUDO_CLASS = PseudoClass.getPseudoClass("eda"); private static final PseudoClass ED4L_PSEUDO_CLASS = PseudoClass.getPseudoClass("ed4l"); private static final PseudoClass EDR2E_PSEUDO_CLASS = PseudoClass.getPseudoClass("edr2e"); private PseudoClassProperty edl = new PseudoClassProperty(EDL_PSEUDO_CLASS, this); private PseudoClassProperty edr = new PseudoClassProperty(EDR_PSEUDO_CLASS, this); private PseudoClassProperty eda = new PseudoClassProperty(EDA_PSEUDO_CLASS, this); private PseudoClassProperty ed4l = new PseudoClassProperty(ED4L_PSEUDO_CLASS, this); private PseudoClassProperty edr2e = new PseudoClassProperty(EDR2E_PSEUDO_CLASS, this); /** The style class of a node. */ private static final String STYLE_CLASS = "elementClass"; /** * Label of EDA/EDL. */ private Label elementLabel; /** * Label tool tip. */ private Tooltip elementLabelTooltip; /** * Dto of element. */ private GenericBean elementDto; /** * Number of element in the loop or line. */ private Integer number; /** * Type I18n key. */ private String typeI18nKey; /** * Global builder. */ private GlobalBuilder globalBuilder; /** * Service instance. */ private IglobalManagement<GenericBean> iglobalManagement; /** * Lucene instance. */ private IluceneFilterConfigDocument iluceneFilterConfigDocument; /** * Constructor. */ public ElementCustomNode() { super(); setPrefWidth(45); setPrefHeight(25); getStyleClass().add(STYLE_CLASS); elementLabel = new Label(); elementLabelTooltip = new Tooltip(); elementLabel.setTooltip(elementLabelTooltip); super.setAlignment(elementLabel, Pos.CENTER); super.getChildren().addAll(elementLabel); } /** * Getter dto. * @return dto */ public final GenericBean getElementDto() { return elementDto; } /** * Setter dto. * @param elementDto1 dto */ public final void setElementDto(final GenericBean elementDto1) { this.elementDto = elementDto1; if (((PointDto)elementDto).getTypePoint() != null) { edl.set(((PointDto)elementDto).getTypePoint().equals(0)); eda.set(((PointDto)elementDto).getTypePoint().equals(1)); ed4l.set(((PointDto)elementDto).getTypePoint().equals(2)); edr2e.set(((PointDto)elementDto).getTypePoint().equals(3)); } } /** * Getter label. * @return label */ public final Label getElementLabel() { return elementLabel; } /** * Setter element label text. * @param txt text */ public final void setElementLabelText(final String txt) { this.elementLabel.setText(txt); this.elementLabelTooltip.setText(txt); } /** * Getter number. * @return num */ public final Integer getNumber() { return number; } /** * Setter number. * @param number1 num */ public final void setNumber(final Integer number1) { this.number = number1; } /** * Getter I18n key. * @return key */ public final String getTypeI18nKey() { return typeI18nKey; } /** * Setter I18n key. * @param typeI18nKey1 key */ public final void setTypeI18nKey(final String typeI18nKey1) { this.typeI18nKey = typeI18nKey1; } /** * Getter global builder. * @return builder */ public final GlobalBuilder getGlobalBuilder() { return globalBuilder; } /** * Setter global builder. * @param globalBuilder1 builder */ public final void setGlobalBuilder(final GlobalBuilder globalBuilder1) { this.globalBuilder = globalBuilder1; } /** * Getter service instance. * @return management service instance */ public final IglobalManagement<GenericBean> getIglobalManagement() { return iglobalManagement; } /** * Setter management service instance. * @param iglobalManagement1 service interface */ public final void setIglobalManagement(final IglobalManagement<GenericBean> iglobalManagement1) { this.iglobalManagement = iglobalManagement1; } /** * Getter lucene adapter. * @return lucene adapter */ public final IluceneFilterConfigDocument getIluceneFilterConfigDocument() { return iluceneFilterConfigDocument; } /** * Setter lucene adapter. * @param iluceneFilterConfigDocument1 lucene adapter */ public final void setIluceneFilterConfigDocument(final IluceneFilterConfigDocument iluceneFilterConfigDocument1) { this.iluceneFilterConfigDocument = iluceneFilterConfigDocument1; } /** * {@inheritDoc}. * @see java.lang.Object#clone() */ @Override public final Object clone() throws CloneNotSupportedException { return super.clone(); } }
CSS
.elementClass { -fx-effect: dropshadow(three-pass-box, black, 4, 0.3, 1, 1); } .elementClass:edl { -fx-background-color: linear-gradient(to bottom right, white, palegoldenrod); } .elementClass:eda { -fx-background-color: linear-gradient(to bottom right, white, lightGreen); } .elementClass:edr { -fx-background-color: linear-gradient(to bottom right, white, lightBlue); } .elementClass:ed4l { -fx-background-color: linear-gradient(to bottom right, white, yellow); } .elementClass:edr2e { -fx-background-color: linear-gradient(to bottom right, white, cyan); }
其余代码只是迭代一个从 1 到 256 的 for 循环,并在每次迭代中创建自定义按钮并设置其图形
最佳答案
我在寻找问题的解决方案时遇到了您的问题。尝试在 Pane 上放置 300 个左右的标签时,我遇到了完全相同的异常。最后,我改用 TableView,现在一切正常。我最好的猜测是 JavaFX Pane 没有优化以支持它们上面的这么多元素。对于这样的事情,TableView 似乎要好得多。
我所做的基本上是在 Pane 上绘制我自己的表格版本,并向其添加滚动 Pane 。我这样做是因为坦率地说,它在 swing 中运行良好,而且我正在替换一些旧的 swing 代码。我会遍历我想显示为标签的字符串列表,并将它们添加到 Pane 中,手动将它们的大小设置为我想要的每一行的高度,但是当应用其他样式设置时,我得到了与你相同的错误。它也非常慢。在 Swing 中绘制不到一秒,而在 JavaFX 中绘制最多需要 20 秒。现在我已经把所有东西都放在一个 fx 表上了,它工作正常。有一些关于如何使用表格的很好的例子,但如果您仍然对此线程感兴趣,我会很乐意在我回来查看时发布一些示例代码。
关于JavaFx java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957426/