/* -------------------
* SelectionDemo6.java
* -------------------
* (C) Copyright 2013, by Object Refinery Limited.
*
*/
package org.jfree.chart.demo.selection;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.InputEvent;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.panel.AbstractMouseHandler;
import org.jfree.chart.panel.selectionhandler.EntitySelectionManager;
import org.jfree.chart.panel.selectionhandler.FreeRegionSelectionHandler;
import org.jfree.chart.panel.selectionhandler.MouseClickSelectionHandler;
import org.jfree.chart.panel.selectionhandler.RegionSelectionHandler;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.demo.ApplicationFrame;
import org.jfree.chart.ui.WindowUtils;
import org.jfree.data.extension.DatasetIterator;
import org.jfree.data.extension.DatasetSelectionExtension;
import org.jfree.data.extension.impl.DatasetExtensionManager;
import org.jfree.data.extension.impl.PieCursor;
import org.jfree.data.extension.impl.PieDatasetSelectionExtension;
import org.jfree.data.general.Dataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.general.SelectionChangeEvent;
import org.jfree.data.general.SelectionChangeListener;
/*
* based on PieChartDemo2
*/
public class SelectionDemo6Pie extends ApplicationFrame
implements SelectionChangeListener<PieCursor<String>> {
private JTable table;
private DefaultTableModel model;
private PieDataset dataset;
public SelectionDemo6Pie(String title) {
super(title);
JPanel chartPanel = createDemoPanel();
chartPanel.setPreferredSize(new java.awt.Dimension(700, 500));
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
split.add(chartPanel);
this.model = new DefaultTableModel(new String[] { "section", "value:"},
0);
this.table = new JTable(this.model);
TableColumnModel tcm = this.table.getColumnModel();
JPanel p = new JPanel(new BorderLayout());
JScrollPane scroller = new JScrollPane(this.table);
p.add(scroller);
p.setBorder(BorderFactory.createCompoundBorder(new TitledBorder(
"Selected Items: "), new EmptyBorder(4, 4, 4, 4)));
split.add(p);
setContentPane(split);
}
private static PieDataset createDataset() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("One", 43.2);
dataset.setValue("Two", 10.0);
dataset.setValue("Three", 27.5);
dataset.setValue("Four", 17.5);
dataset.setValue("Five", 11.0);
dataset.setValue("Six", 19.4);
return dataset;
}
private static JFreeChart createChart(final PieDataset dataset, DatasetSelectionExtension<PieCursor<String>> ext) {
JFreeChart chart = ChartFactory.createPieChart("Pie Chart Demo 2",
dataset);
final PiePlot plot = (PiePlot) chart.getPlot();
plot.setSectionPaint("One", new Color(160, 160, 255));
plot.setSectionPaint("Two", new Color(128, 128, 255 - 32));
plot.setSectionPaint("Three", new Color(96, 96, 255 - 64));
plot.setSectionPaint("Four", new Color(64, 64, 255 - 96));
plot.setSectionPaint("Five", new Color(32, 32, 255 - 128));
plot.setSectionPaint("Six", new Color(0, 0, 255 - 144));
plot.setNoDataMessage("No data available");
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0} ({2} percent)"));
plot.setLabelBackgroundPaint(new Color(220, 220, 220));
plot.setLegendLabelToolTipGenerator(new StandardPieSectionLabelGenerator(
"Tooltip for legend item {0}"));
plot.setSimpleLabels(true);
plot.setInteriorGap(0.1);
//pie plots done use abstract renderers need to react to selection on our own
final PieCursor<String> cursor = new PieCursor<String>();
ext.addChangeListener(new SelectionChangeListener<PieCursor<String>>() {
public void selectionChanged(SelectionChangeEvent<PieCursor<String>> event) {
for (int i = 0; i < dataset.getItemCount(); i++) {
cursor.setPosition((String)dataset.getKey(i));
if (event.getSelectionExtension().isSelected(cursor)) {
plot.setExplodePercent(cursor.key, 0.15);
} else {
plot.setExplodePercent(cursor.key, 0.0);
}
}
}
});
return chart;
}
public final JPanel createDemoPanel() {
this.dataset = createDataset();
//extend dataset and add selection change listener for the demo
DatasetSelectionExtension<PieCursor<String>> datasetExtension
= new PieDatasetSelectionExtension<String>(this.dataset);
datasetExtension.addChangeListener(this);
//standard setup
JFreeChart chart = createChart(this.dataset, datasetExtension);
ChartPanel panel = new ChartPanel(chart);
panel.setMouseWheelEnabled(true);
//add a selection handler with shift modifier for clicking
RegionSelectionHandler selectionHandler
= new FreeRegionSelectionHandler();
AbstractMouseHandler clickHandler = new MouseClickSelectionHandler(
InputEvent.SHIFT_MASK);
panel.addMouseHandler(selectionHandler);
panel.addMouseHandler(clickHandler);
panel.removeMouseHandler(panel.getZoomHandler());
// add a selection manager
DatasetExtensionManager dExManager = new DatasetExtensionManager();
dExManager.registerDatasetExtension(datasetExtension);
panel.setSelectionManager(new EntitySelectionManager(panel,
new Dataset[] { dataset }, dExManager));
return panel;
}
public void selectionChanged(SelectionChangeEvent<PieCursor<String>>
event) {
while (this.model.getRowCount() > 0) {
this.model.removeRow(0);
}
PieDatasetSelectionExtension<String> ext
= (PieDatasetSelectionExtension<String>)
event.getSelectionExtension();
DatasetIterator<PieCursor<String>> iter = ext.getSelectionIterator(
true);
while (iter.hasNext()) {
PieCursor<String> dc = iter.next();
this.model.addRow(new Object[] {dc.key, this.dataset.getValue(
dc.key)});
}
}
public static void main(String[] args) {
SelectionDemo6Pie demo = new SelectionDemo6Pie(
"JFreeChart: SelectionDemo6Pie.java");
demo.pack();
WindowUtils.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}