JavaFx java.lang.StackOverflowError

标签 java css javafx-8

当我试图一次设置 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/

相关文章:

java - Java Mapreduce 中的驱动程序类错误

java - 雪花无法显示/解释 unicode '\u0089'

java - 如何使用 Lambda 在 S3 存储桶内触发应用程序?

Javascript - 在点击的链接下方打开弹出式 div

javascript - 如何使用 JSON 结构创建 HTML 导航

java - 在运行 Android 的 JavaFx 中显示节点的延迟

Java 大数负数?

javascript - 如何获取父 div 元素的子元素

java - 从 JavaFX 2.2 到 JavaFX8

JavaFx Shape Intersect 始终返回 false/true