【发布时间】: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?
-
谢谢大家..你可以找到代码
-
我觉得问题出在你的循环中,你可以给代码