Java 在ListCellRenderer中呈现JList内容时发生OutOfMemoryError

Java 在ListCellRenderer中呈现JList内容时发生OutOfMemoryError,java,swing,jfreechart,jlist,listcellrenderer,Java,Swing,Jfreechart,Jlist,Listcellrenderer,我试图在JList的图表中表示一些数据。在我创建图表面板列表之前。目前,我正在尝试JList ofXYSeriesCollection,然后在自定义的ListCellRenderer中呈现其内容 但是,当我试图通过拖动光标滚动JScrollpane时,遇到了OutOfMemoryError Java虚拟机选项:-d64-Xmx400m 为什么会这样?渲染中应该更改什么 导入java.awt.BorderLayout; 导入java.awt.Color; 导入java.awt.Component

我试图在JList的图表中表示一些数据。在我创建图表面板列表之前。目前,我正在尝试JList of
XYSeriesCollection
,然后在自定义的
ListCellRenderer
中呈现其内容

但是,当我试图通过拖动光标滚动JScrollpane时,遇到了
OutOfMemoryError

Java虚拟机选项:
-d64-Xmx400m

为什么会这样?渲染中应该更改什么

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.util.Random;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.ListCellRenderer;
导入javax.swing.ListSelectionModel;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
/**
*@见https://stackoverflow.com/a/40445144/230513
*/
公共类缩略图列表{
公共静态JScrollPane滚动窗格;
公共静态JList图表列表;
公共静态void main(最终字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新JFrame(“测试”);
JPanel panel=newjpanel(newborderlayout());
chartList=新的chartList();
scrollPane=新的JScrollPane(图表列表,
JScrollPane.VERTICAL\u滚动条\u始终,
JScrollPane.HORIZONTAL\u SCROLLBAR\u NEVER);
panel.add(滚动窗格,BorderLayout.CENTER);
f、 设置首选尺寸(新尺寸(1000700));
f、 设置内容窗格(面板);
f、 包装();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
});
}
}
类图表列表扩展了JList{
私有静态最终随机=新随机();
私有静态最终整数部分=50;
私有静态最终整数样本=200;
专用静态最终int W=300;
专用静态最终int H=W;
图表列表(){
DefaultListModel listModel=新的DefaultListModel();

对于(int i=0;i尝试仅使用一个JFreeChart和一个ChartPanel,并将其重新用于渲染器。当前,您正在为每个单元格中的每个绘制请求创建一个新图表

因此,这些对象应该是类的成员对象,uppon请求设置数据并返回chartPanel

编辑:

下面是一个例子。我不知道确切的方法签名,所以我只将方法命名为“setData”:

static class ChartListRenderer implements ListCellRenderer<XYSeriesCollection> {

  private JFreeChart chart = ChartFactory.createXYLineChart("Random", "counts", "samples");
  private ChartPanel chartPanel = new ChartPanel(chart, true, true, true, false, true){
    @Override
    public Dimension getPreferredSize() {
      return new Dimension(W, H);}
  };

  @Override
  public Component getListCellRendererComponent(JList<? extends XYSeriesCollection> chartList, XYSeriesCollection serie, int index,
                                                boolean isSelected, boolean cellHasFocus) {
    chart.setData(serie);
    return chartPanel;
  }
}
静态类ChartListRenderer实现ListCellRenderer{
private JFreeChart chart=ChartFactory.createXYLineChart(“随机”、“计数”、“样本”);
私有ChartPanel ChartPanel=新ChartPanel(图表,真,真,真,假,真){
@凌驾
公共维度getPreferredSize(){
返回新维度(W,H);}
};
@凌驾
公共组件GetListCellRenderComponent(JList正如@PaL所建议的,您的
ListCellRenderer
可以创建
JFreeChart
及其封闭的
ChartPanel
的单个实例
implementation被调用,它可以简单地更新图表绘图使用的数据集。结果可以在所示的samll堆中轻松运行

@Override
public Component getListCellRendererComponent(
    JList modelList, XYSeriesCollection series,
        int index, boolean isSelected, boolean hasFocus) {
    XYPlot plot = chart.getXYPlot();
    plot.setDataset(series);
    return chartPanel;
}

测试时:
$java-d64-Xmx64m-cp.:$JFREE\u LIB/*ModelListTest

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Random;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/q/46527131/230513
 * @see https://stackoverflow.com/a/40445144/230513
 */
public class ModelListTest {

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("Test");
                f.add(new JScrollPane(new ModelList()));
                f.pack();
                f.setSize(640, 480);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }

    private static class ModelList extends JList<XYSeriesCollection> {

        private static final Random random = new Random();
        private static final int charts = 50;
        private static final int samples = 200;
        private static final int W = 300;
        private static final int H = W;

        ModelList() {
            DefaultListModel<XYSeriesCollection> listModel = new DefaultListModel<>();
            for (int i = 0; i < charts; i++) {
                listModel.addElement(createRandomSeries());
            }
            this.setModel(listModel);
            this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            this.setCellRenderer(new ModelListRenderer());
            this.setVisibleRowCount(0);
            this.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            this.setSelectionForeground(Color.RED);
        }

        private static XYSeriesCollection createRandomSeries() {
            final XYSeries series = new XYSeries("Data");
            for (int i = 0; i < random.nextInt(samples) + samples; i++) {
                series.add(i, random.nextGaussian());
            }
            XYSeriesCollection dataset = new XYSeriesCollection(series);
            return dataset;
        }

        private static class ModelListRenderer implements ListCellRenderer<XYSeriesCollection> {

            private JFreeChart chart;
            private ChartPanel chartPanel;

            public ModelListRenderer() {
                chart = ChartFactory.createXYLineChart("Random", "counts", "samples", null);
                chartPanel = new ChartPanel(chart, true, true, true, false, true) {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(W, H);
                    }
                };
            }

            @Override
            public Component getListCellRendererComponent(
                JList modelList, XYSeriesCollection series, int index, boolean isSelected, boolean hasFocus) {
                XYPlot plot = chart.getXYPlot();
                plot.setDataset(series);
                return chartPanel;
            }
        }
    }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.util.Random;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JScrollPane;
导入javax.swing.ListCellRenderer;
导入javax.swing.ListSelectionModel;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
/**
*@见https://stackoverflow.com/q/46527131/230513
*@见https://stackoverflow.com/a/40445144/230513
*/
公共类模型列表测试{
公共静态void main(最终字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新JFrame(“测试”);
f、 添加(新的JScrollPane(新的ModelList());
f、 包装();
f、 设置大小(640480);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
});
}
私有静态类模型列表扩展了JList{
私有静态最终随机=新随机();
私有静态最终整数图表=50;
私有静态最终整数样本=200;
专用静态最终int W=300;
专用静态最终int H=W;
模型列表(){
DefaultListModel listModel=新的DefaultListModel();
对于(int i=0;iimport java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Random;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/q/46527131/230513
 * @see https://stackoverflow.com/a/40445144/230513
 */
public class ModelListTest {

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("Test");
                f.add(new JScrollPane(new ModelList()));
                f.pack();
                f.setSize(640, 480);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }

    private static class ModelList extends JList<XYSeriesCollection> {

        private static final Random random = new Random();
        private static final int charts = 50;
        private static final int samples = 200;
        private static final int W = 300;
        private static final int H = W;

        ModelList() {
            DefaultListModel<XYSeriesCollection> listModel = new DefaultListModel<>();
            for (int i = 0; i < charts; i++) {
                listModel.addElement(createRandomSeries());
            }
            this.setModel(listModel);
            this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            this.setCellRenderer(new ModelListRenderer());
            this.setVisibleRowCount(0);
            this.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            this.setSelectionForeground(Color.RED);
        }

        private static XYSeriesCollection createRandomSeries() {
            final XYSeries series = new XYSeries("Data");
            for (int i = 0; i < random.nextInt(samples) + samples; i++) {
                series.add(i, random.nextGaussian());
            }
            XYSeriesCollection dataset = new XYSeriesCollection(series);
            return dataset;
        }

        private static class ModelListRenderer implements ListCellRenderer<XYSeriesCollection> {

            private JFreeChart chart;
            private ChartPanel chartPanel;

            public ModelListRenderer() {
                chart = ChartFactory.createXYLineChart("Random", "counts", "samples", null);
                chartPanel = new ChartPanel(chart, true, true, true, false, true) {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(W, H);
                    }
                };
            }

            @Override
            public Component getListCellRendererComponent(
                JList modelList, XYSeriesCollection series, int index, boolean isSelected, boolean hasFocus) {
                XYPlot plot = chart.getXYPlot();
                plot.setDataset(series);
                return chartPanel;
            }
        }
    }
}