【问题标题】:JavaFx java.lang.StackOverflowErrorJavaFx java.lang.StackOverflowError
【发布时间】:2014-07-25 13:55:45
【问题描述】:

我尝试一次设置 256 个 JavaFx 按钮的图形时遇到了一个非常奇怪的错误。我试图设置为按钮图形的节点是堆栈窗格。在我看来,由于同时设置这么多按钮的图形的繁重操作,该应用程序的资源耗尽了,但我不确定。 任何形式的建议都受到高度赞赏。

错误日志如下:

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)

sn-p代码如下:

  • 自定义按钮类

    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;
        }
    
    }
    
  • 用作上述按钮图形的自定义堆栈窗格类

    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 循环,并在每次迭代中创建自定义按钮并设置其图形

【问题讨论】:

  • 能发一些代码吗?
  • 需要代码。您希望我们如何帮助您,只需查看 Staketrace 即可?
  • 从堆栈跟踪中的各种方法调用来看,它看起来像是在处理 CSS。您能否发布所有与按钮样式相关的代码,包括 Java 和 CSS?
  • 谢谢大家..你可以找到代码
  • 我觉得问题出在你的循环中,你可以给代码

标签: java css javafx-8


【解决方案1】:

我在寻找问题的解决方案时遇到了您的问题。尝试在窗格上放置 300 个左右的标签时,我遇到了完全相同的异常。最后,我改用 TableView,现在一切正常。我最好的猜测是 JavaFX 窗格没有经过优化以支持它们上的这么多项目。对于这样的东西,TableView 似乎要好得多。

我所做的基本上是在窗格上绘制我自己的表格版本,并向其添加滚动窗格。我这样做是因为坦率地说它在 Swing 中运行良好,而且我正在替换一些旧的 Swing 代码。我会遍历我想要显示为标签的字符串列表并将它们添加到窗格中,手动将它们的大小设置为我想要的每一行的高度,但是当应用其他样式设置时,我得到了和你一样的错误。它也非常缓慢。在 Swing 中用不到一秒钟的时间来绘制,而在 JavaFX 中绘制则需要长达 20 秒。现在我已经把所有东西都放在了一个 fx 表上,它工作正常。有一些关于如何使用表格的很好的例子,但是如果你仍然对这个线程感兴趣,我很乐意在我回来查看时发布一些示例代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多