生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

JFeeChartを使った、折れ線グラフの追加と削除の方法

以前、ActionEventに連動して折れ線グラフを追加することを書いたので、今回はActionEventに連動して追加した折れ線グラフを削除するコードを書いた。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class RemoveTest extends JFrame implements ActionListener {
	Random rand = new Random();
	JFrame sFrame;
	XYSeriesCollection trace;
	XYSeries series;
	XYSeries series1;
	XYSeries series2;
	ChartPanel cpane;
	int counter = 0;
	int remCounter;
	int [] a;
	int [] b;
	int [] c;
	
	//グラフに書く用のDataを作成する
	public void MakeData() {
		a = new int [50];
		b = new int [50];
		c = new int [50];
		
		for (int i = 0; i < 50; i++) {
			a[i] = rand.nextInt(100) + 1;
			b[i] = rand.nextInt(80) + 1;
			c[i] = rand.nextInt(60) + 1;
		}
	}
	
	//SeriesへのDataの添付
	public void seriesAdd(XYSeries a, int [] data) {
		for (int i = 0; i < data.length; i++) {
			a.add(i, data[i]);
		}
	}
	
	//最初のグラフを描く
	public void MakeFig() {
		MakeData();
		sFrame = new JFrame("Fig");
		sFrame.setBounds(300, 300, 300, 200);
		sFrame.setVisible(true);
		
		trace = new XYSeriesCollection ();
		series = new XYSeries("check");
		
		seriesAdd(series, a);
		trace.addSeries(series);
		
		JFreeChart chart = ChartFactory.createXYLineChart(
				"Data",
				"Frame",
				"Value",
				trace,
				PlotOrientation.VERTICAL,
				true,
				false,
				false);
		
		cpane = new ChartPanel(chart);
		sFrame.getContentPane().add(cpane);
	}
	
	//2つ目のグラフを追加
	public void add1() {
		series1 = new XYSeries("Test1");
		seriesAdd(series1, b);
		trace.addSeries(series1);
		sFrame.add(cpane);
	}
	
	//3つ目のグラフを追加
	public void add2() {
		series2 = new XYSeries("Test2");
		seriesAdd(series2, c);
		trace.addSeries(series2);
		sFrame.add(cpane);
	}
	
	//2つ目のグラフを削除
	public void rem1() {
		trace.removeSeries(series1);
		sFrame.add(cpane);
	}
	
	//3つ目のグラフを削除
	public void rem2() {
		trace.removeSeries(series2);
		sFrame.add(cpane);
	}
 	
	public void actionPerformed(ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("make")) { //グラフの作成
			MakeFig();
		} else if (cmd.equals("add")) { //2つ目のグラフを追加
			if (counter == 0) {
				add1();
				counter++;
				remCounter = 1;
			} else if (counter == 1){ //3つ目のグラフを追加
				add2();
				remCounter = 0;
			}
		} else if (cmd.equals("remove")) { //3つ目のグラフを削除
			if (remCounter == 0) {
				rem2();
				remCounter++;
				counter=1;
			} else if (remCounter == 1) { //2つ目のグラフを削除
				rem1();
				counter=0;
			}
		}
	}
	
	RemoveTest () {
		JButton button = new JButton ("Make");
		JButton addB = new JButton ("add");
		JButton remB = new JButton ("Remove");
		button.addActionListener(this);
		addB.addActionListener(this);
		remB.addActionListener(this);
		button.setActionCommand("make");
		addB.setActionCommand("add");
		remB.setActionCommand("remove");
		button.setBounds(40, 10, 80, 30);
		addB.setBounds(40, 50, 80, 30);
		remB.setBounds(40, 90, 80, 30);
		JPanel pane = new JPanel();
		pane.setLayout(null);
		pane.add(button);
		pane.add(addB);
		pane.add(remB);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		RemoveTest frame = new RemoveTest ();
		frame.setBounds(10, 10, 180, 170);
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

折れ線グラフの削除は、

    public void rem1() {
	trace.removeSeries(series1);
	sFrame.add(cpane);
    }

の部分で行っている。

折れ線グラフの追加は"addSeries"で、削除は"removeSeries"で出来る。