当前位置: 首页 > 知识库问答 >
问题:

内存不足错误和 ComboBox 中的 ObservableList 问题

孙熠彤
2023-03-14

我在javafx2中创建了一个fxml文件。

我有一个Person对象列表。此列表的名称为<code>条目</code>。我有一个ObservableList,myObservarableList。我想在里面贴上标签。每个标签必须包含一对人物形象和姓名文本。我写这段代码:

for (int i=0; i<numberOfEntries; i++){                               
    currentEntry = Entries.get(i);
    name=currentEntry.getName();                                  
    image1 = new Image("file:"+currentEntry.getIcon());                    
    imageView1= new ImageView();
    imageView1.setFitHeight(50);
    imageView1.setFitWidth(70);
    imageView1.setImage(image1);                       
    label = new Label(name, imageView1);
    label.setFont(new Font("serif", 32));                         
    myObservableList.add(label);                   
}

它工作正常,但在放置了几张图像后,JVM会给我以下错误消息:

Caused by: java.lang.OutOfMemoryError: Java heap space.

此错误来自代码行image1=newImage(“file:”currentEntry.getIcon())

最后,我想把myObservableList的所有元素放入一个ComboBox项中。为此,在java控制器的初始化方法中,我编写了:

    myComboBox.setItems(myObservableList);

    ListCell<Label> buttonCell = new ListCell<Label>() {
         @Override protected void updateItem(Label item, boolean isEmpty) {
         super.updateItem(item, isEmpty);
            setText(item==null ? "" : item.getText());                 
        }
    };

    myComboBox.setButtonCell(buttonCell);

我确信我在javafx方面没有足够的经验,而且我不知道我必须如何处理,因为我有一个组合框,在同一个单元格中有一对图标和文本,用于所有项目。

我想表达我对Peter Duniho和PakkuDon的感谢,他们帮助我提高了我的英语水平。


共有1个答案

农鸿达
2023-03-14
匿名用户

使用< code>Node类作为< code>ComboBox(或任何其他控件)的数据类型几乎总是错误的。您应该使用只表示数据的类,并注册一个单元工厂来配置数据的显示方式。

在您的情况下,如果您在数据中包含图像,您可能会遇到内存问题。每个图像很可能在内存中用几兆字节表示。因此,您的数据类应该包含图像名称,然后您可以使用组合框中的单元格来创建图像。

以下是一些示例代码,可以为您提供想法:

数据类(Person.java):

public class Person {
    private final String name ;
    private final String imageFileName ;

    public Person(String name, String imageFileName) {
        this.name = name ;
        this.imageFileName = imageFileName ;
    }

    public String getName() {
        return name ;
    }

    public String getImageFileName() {
        return imageFileName ;
    }
}

从< code >列表创建< code>ComboBox的UI代码

List<Person> entries = ... ; // populated from DB

ComboBox<Person> comboBox = new ComboBox<>();
comboBox.getItems().addAll(entries);

comboBox.setCellFactory(new Callback<ListView<Person>, ListCell<Person>>() {
    @Override
    public ListCell<Person> call(ListView<Person> listCell) {

        return new ListCell<Person>() {
            private final ImageView = new ImageView();
            @Override
            public void updateItem(Person person, boolean empty) {
                super.updateItem(person, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    File imageFile = new File(person.getImageFileName());
                    String imageUrl = imageFile.toURI().toURL().toExternalForm();
                    Image image = new Image(imageUrl, 70, 50, 
                        // preserve ratio
                        true, 
                        // smooth resizing
                        true,
                        // load in background
                        true);
                    imageView.setImage(image);
                    setText(person.getName());
                    setGraphic(imageView);
                }
            }
        };
    }
});

您可以对ComboBoxbuttonCell使用相同的ListCell实现。

这里的要点是,单元格只为可见单元格创建,所以图像是在单元格显示时“按需”加载的。使用接受宽度和高度参数的< code>Image构造函数还可以减少内存占用,因为< code>Image对象可以在加载时调整大小。

最后,请注意,使用标志在后台加载图像很重要,这可以保持UI的响应性。如果你快速滚动,你可能会看到一些图像暂时没有加载;一旦图像可用,单元格将被适当地重新绘制。

 类似资料:
  • 问题内容: 我尝试按照此http://hadoop.apache.org/common/docs/stable/single_node_setup.html文档安装Hadoop 。当我尝试执行此 我收到以下异常 请提出一个解决方案,以便我可以尝试该示例。整个异常在下面列出。我是Hadoop的新手,我可能做过一些愚蠢的事情。任何建议将不胜感激。 问题答案: 您可以通过编辑conf / mapred-

  • 问题内容: 我是Netbeans中这种错误的新手。我一直在使用Java Bean 8.0.2在Java J2SE中工作。我正在对字符串进行模糊搜索,通常字符串长度为300-500。我正在使用Levenshtein和Jaro Winkler算法来查找字符串之间的距离。大约有1500次迭代来查找字符串之间的距离!问题是我的Net Bean通常会为以下内容提供错误: 我已经在线进行了一些搜索来摆脱此错误

  • 上周,我们在生产环境中遇到了内存不足的错误。这种内存不足的错误可能每周发生一次,当前的解决方案是重新启动应用程序服务器。我们使用的是glassfish 3.0.1。生成的堆转储约为5GB。 请帮助分析下面的堆转储。下面是使用eclipse MAT生成的泄漏嫌疑人报告。我们如何分析下面的报告?

  • 问题内容: 在运行时,我试图将图像放置在表面视图中。当我尝试使用Drawable文件夹中的图像时,出现内存不足错误。在中快速搜索之后,我发现,如果我们从资产文件夹访问图像,将会有所缓解。但仍然在运行时出现内存不足错误。 我已经分析发现,扩展将有助于解决此类与内存相​​关的问题。问题是我的图像尺寸为1280 x 720,设备尺寸也相同。因此,我觉得缩放不会有任何效果。 由于我们在该社区中拥有专家,如

  • 问题内容: 我正在尝试运行ant任务,但是出现以下错误: 我尝试使用谷歌搜索来查找如何设置此值,但找不到。我努力了 我努力了 但我仍然遇到同样的例外。我尝试将值成功增加到1024m 更新资料 我解决了 它与很少的内存无关。在我的javadoc一代中,这是一个无休止的循环。 问题答案: 我解决了 它与很少的内存无关。在我的javadoc一代中,这是一个无休止的循环。 为ant设置更多内存的正确方法是

  • 我的spark程序在小数据集上运行良好。(大约400GB)但是当我将其扩展到大型数据集时。我开始得到错误