从CombinedDomainXYPlot获取图(并删除它们)

时间:2015-06-04 15:16:52

标签: java jfreechart

如果我不保留对它们的任何引用,有没有办法将情节列表添加到CombinedDomainXYPlot

我希望到达那里,与他们一起工作,并可能将他们从合成的情节中删除。

这是将图表添加到CombinedDomainXYPlot的示例代码:

// axis
DateAxis domainAxis = new DateAxis("Date");

// plot container
CombinedDomainXYPlot plotCombined = new CombinedDomainXYPlot(domainAxis);

// plot 1
XYPlot plot1 = new XYPlot();
plot1.setDomainAxis(domainAxis);
plotCombined.add(plot1);

// plot 2
XYPlot plot2 = new XYPlot();
plot2.setDomainAxis(domainAxis);
plotCombined.add(plot2);

更新1:

我刚试过这段代码,但它并没有返回所有的情节。它不可靠。

for (Object sp : plotCombined.getSubplots()) {
    plotCombined.remove((XYPlot)sp);
}

这种删除图表的方法是否正确?

完整的示例代码:

import javax.swing.JFrame;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.XYPlot;


public class sample27 extends JFrame {

    public sample27()  {
        super("sample27");

        // axis
        DateAxis domainAxis = new DateAxis("Date");

        // plot container
        CombinedDomainXYPlot plotCombined = new CombinedDomainXYPlot(domainAxis);

        // plot 1
        XYPlot plot1 = new XYPlot();
        plot1.setDomainAxis(domainAxis);
        plotCombined.add(plot1);

        // plot 2
        XYPlot plot2 = new XYPlot();
        plot2.setDomainAxis(domainAxis);
        plotCombined.add(plot2);

        System.out.println("plot count before: " + plotCombined.getSubplots().size());
        for (Object sp : plotCombined.getSubplots()) {
            System.out.println("removing subplot: " + sp);
            plotCombined.remove((XYPlot)sp);
        }
        System.out.println("plot count after: " + plotCombined.getSubplots().size());       
    }

    public static void main(String[] args) {
        new sample27();
    }   

}

输出:

plot count before: 2
removing subplot: org.jfree.chart.plot.XYPlot@15615099
plot count after: 1

2 个答案:

答案 0 :(得分:2)

getSubplots返回包含所有项目的List - 此List copy 从使用Collections.unmodifiableList的角度来看,它返回一个由原始版本支持的新List。当您遍历List时,项目实际上已从基础List中删除,从而影响Collection上的迭代。

不是依赖迭代(例如for (Object sp : plotCombined.getSubplots())),而是向后循环数组并使用索引删除项目。

for ( int i = plotCombined.getSubplots().size() - 1; i >= 0; i-- ){
    plotCombined.remove((XYPlot)plotCombined.getSubplots().get(i));
}

答案 1 :(得分:1)

作为here所示方法的替代方法,迭代从getSubplots()返回的不可修改列表构造的可修改列表。

代码:

List<XYPlot> list = new ArrayList<>(plotCombined.getSubplots());
for (XYPlot plot : list) {
    plotCombined.remove(plot);
}

控制台:

plot count before: 2
plot count after: 0