JavaFx如何在ChoiceBox中添加4000个项目

时间:2013-12-11 08:35:51

标签: javafx heap-memory

在ChoiceBox中添加4000个主题是否有任何意义? 我的代码工作正常,但我得到错误内存不足。

我的代码是:

 listItemsDevices.setItems(FXCollections.observableArrayList(resultSet));
 listItemsDevices.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
 @Override
 public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
 indexOfSumarnoTehtniceDropdown =listItemsDevices.getSelectionModel().getSelectedIndex();
 System.out.println("INDEX "+indexOfSumarnoTehtniceDropdown);
 }  
 });

我的FXML是:

 <ChoiceBox fx:id="listItemsDevices">
    <items>
       <FXCollections fx:factory="observableArrayList">
         <String fx:value="Item 1" />
         <String fx:value="Item 2" />
         <String fx:value="Item 3" />
       </FXCollections>
    </items>
 </ChoiceBox>

我得到错误最重要的原因是:java.lang.OutOfMemoryError:Java堆空间。任何想法如何解决这个问题??

     Exception in Application start method java.lang.OutOfMemoryError: Java heap space
at java.util.jar.Manifest.read(Unknown Source)
at java.util.jar.Manifest.<init>(Unknown Source)
at java.util.jar.JarFile.getManifestFromReference(Unknown Source)
at java.util.jar.JarFile.getManifest(Unknown Source)
at sun.misc.URLClassPath$JarLoader$2.getManifest(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javafx.scene.Scene$MouseHandler.updateCursorFrame(Unknown Source)
at javafx.scene.Scene$ScenePulseListener.pulse(Unknown Source)
at com.sun.javafx.tk.Toolkit.firePulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
    Exception in thread "main" java.lang.RuntimeException: Application launch error
at com.sun.javafx.application.LauncherImpl$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.jar.Manifest$FastInputStream.<init>(Unknown Source)
at java.util.jar.Manifest$FastInputStream.<init>(Unknown Source)
at java.util.jar.Manifest.read(Unknown Source)
at java.util.jar.Manifest.<init>(Unknown Source)
at java.util.jar.JarFile.getManifestFromReference(Unknown Source)
at java.util.jar.JarFile.getManifest(Unknown Source)
at sun.misc.URLClassPath$JarLoader$2.getManifest(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.sun.javafx.application.PlatformImpl.tkExit(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at com.sun.javafx.application.LauncherImpl.access$000(Unknown Source)
... 2 more

1 个答案:

答案 0 :(得分:1)

首先,您可以尝试增加堆大小:)

但我的建议是使用像Android一样的懒惰显示策略与列表视图。仅加载可见的这些项目。这意味着,创建一个具有固定数量CheckBox的ScrollPane(如果你有更少的项目,则创建更少)。听滚动事件。加载集合的项目并使用CheckBoxes连接。通常,您可以通过在当前子列表之前和之后加载固定数量的项目来改善用户体验,以便加快滚动速度。