簡體   English   中英

JavaFx java.lang.StackOverflowError

[英]JavaFx java.lang.StackOverflowError

嘗試同時設置256個JavaFx Button的圖形時,我遇到了一個非常奇怪的錯誤。 我試圖設置為按鈕圖形的節點是一個堆棧窗格。 在我看來,該應用程序會耗盡資源,因為這種繁瑣的操作需要同時設置多個按鈕的圖形,但是我不確定。 任何建議都是高度贊賞的。

錯誤日志如下:

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; } } 
  • 自定義堆棧窗格類將用作上述按鈕的圖形

     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); } 
  • 剩下的代碼只是將for循環從1循環到256,並創建自定義按鈕並在每次迭代中設置其圖形

我在尋找解決方案時遇到了您的問題。 嘗試在窗格上放置300個左右的標簽時,我遇到了完全相同的異常。 最后,我切換到使用TableView,現在一切正常。 我最好的猜測是JavaFX窗格未經過優化以支持其上的眾多項目。 對於這樣的東西,TableView似乎要好得多。

我所做的基本上是在窗格上繪制自己的表格版本,並向其中添加滾動窗格。 我這樣做是因為坦率地說,它在Swing中工作得很好,並且我正在替換一些舊的Swing代碼。 我將遍歷要顯示為標簽的字符串列表,並將其添加到窗格中,將它們的大小手動設置為我想要的每一行高,但是當應用其他樣式設置時,我遇到與您相同的錯誤。 這也非常慢。 揮舞不到一秒鍾的時間,用JavaFX繪制最多需要20秒。 現在,我已將所有內容放在fx表上,一切正常。 有一些關於如何使用表的很好的示例,盡管如果您仍然對此線程感興趣,我會很樂意在返回時發布一些示例代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM