有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

但是我在尝试通过拖动光标滚动JScrollpane时遇到了OutOfMemoryError

Java虚拟机选项:-d64 -Xmx400m

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

enter image description here

import java.awt.BorderLayout;
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.JPanel;
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.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/a/40445144/230513
 */

public class ThumbnailChartsJList{

public static JScrollPane scrollPane;
public static JList<XYSeriesCollection> chartList;

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

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            JFrame f = new JFrame("Test");
            JPanel panel = new JPanel(new BorderLayout());

            chartList = new ChartList();

            scrollPane = new JScrollPane(chartList,
                    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


            panel.add(scrollPane, BorderLayout.CENTER);
            f.setPreferredSize(new Dimension(1000,700));
            f.setContentPane(panel);
            f.pack();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });

}

}

class ChartList extends JList<XYSeriesCollection>{

    private static final Random random = new Random();
    private static final int NumberCharts = 50;
    private static final int Samples = 200;

    private static final int W = 300;
    private static final int H = W;

    ChartList(){
        DefaultListModel<XYSeriesCollection> listModel = new DefaultListModel<XYSeriesCollection>();


        for (int i=0; i<NumberCharts; i++){
            XYSeriesCollection serie = createRandomSerie();
            listModel.addElement(serie);
        }
        this.setModel(listModel);
        this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        this.setCellRenderer(new ChartListRenderer());
        this.setVisibleRowCount(0); //0 - dynamic rows
        this.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        this.setSelectionForeground(Color.RED);
    }

    private static XYSeriesCollection createRandomSerie() {

        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;    
    }

    static class ChartListRenderer implements ListCellRenderer<XYSeriesCollection> {

        @Override
        public Component getListCellRendererComponent(JList<? extends XYSeriesCollection> chartList, XYSeriesCollection serie, int index,
            boolean isSelected, boolean cellHasFocus) {

            JFreeChart chart = ChartFactory.createXYLineChart("Random", "counts", "samples", serie);

            ChartPanel chartPanel = new ChartPanel(chart, true, true, true, false, true){
                @Override
                public Dimension getPreferredSize() {
                return new Dimension(W, H);}
            };
            return chartPanel;
        }

    }
}

共 (0) 个答案