Reputation: 147
I have a JFrame with a JPanel in it, the component i have added to the JPanel needs needs to be displayed upside down (its a JFreeChart) is there a simple way to rotate it by 180 degrees?
package testchart;
import java.awt.Color;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYAreaRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class test99 {
public static void main(String[] args) {
XYSeries series1= new XYSeries("AAA needle");
series1.add(0.0,16);
series1.add(-1.168,15);
series1.add(1.168,15);
series1.add(-1.219,14);
series1.add(1.219,14);
series1.add(-1.270,13);
series1.add(1.270,13);
series1.add(-1.321,12);
series1.add(1.321,12);
series1.add(-1.372,11);
series1.add(1.372,11);
series1.add(-1.422,10);
series1.add(1.422,10);
series1.add(-1.473,9);
series1.add(1.473,9);
series1.add(-1.524,8);
series1.add(1.524,8);
series1.add(-1.600,7);
series1.add(1.600,7);
series1.add(-1.712,6);
series1.add(1.712,6);
series1.add(-1.829,5);
series1.add(1.829,5);
series1.add(-1.918,4);
series1.add(1.918,4);
series1.add(-1.994,3);
series1.add(1.994,3);
series1.add(-2.068,2);
series1.add(2.068,2);
series1.add(-2.159,1);
series1.add(2.159,1);
series1.add(-2.261,0);
series1.add(2.261,0);
XYSeriesCollection xyDataset = new XYSeriesCollection();
xyDataset.addSeries(series1);
JFreeChart chart = ChartFactory.createXYLineChart("","","",xyDataset,PlotOrientation.VERTICAL,true,false,false);
chart.setBackgroundPaint(Color.yellow);
XYPlot plot = (XYPlot) chart.getPlot();
//NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
//xAxis.setTickLabelsVisible(true);
//xAxis.setVisible(false);
//NumberAxis yAxis = (NumberAxis) plot.getRangeAxis();
//yAxis.setTickLabelsVisible(false);
//yAxis.setVisible(false);
XYAreaRenderer renderer = new XYAreaRenderer();
plot.setRenderer(0, renderer);
plot.setBackgroundPaint (Color.WHITE);
JFrame testframe = new JFrame("test chart"); // frame to hold panel
ChartPanel frame = new ChartPanel(chart); // chart panel that has the chart and needs to be upside down
testframe.add(frame); // adds chart to frame
testframe.setSize (200, 600); // frame size
testframe.setVisible(true);
}
}
thank you for any help given
Upvotes: 1
Views: 1980
Reputation: 205865
As shown here, rotating the view causes the range axis and legend to be inverted, too. As an alternative, you can invert the dataset, as shown below:
Inverted series = new Inverted("AAA needle");
series.add(…);
…
series.invert();
…
private static class Inverted extends XYSeries {
List<XYDataItem> list = data;
public Inverted(Comparable key) {
super(key);
}
public void invert() {
double max = getMaxY();
for (XYDataItem item : list) {
item.setY(max - item.getYValue());
}
}
}
SSCCE, as run:
import java.awt.Color;
import java.awt.Dimension;
import java.util.List;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYAreaRenderer;
import org.jfree.data.xy.XYDataItem;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class test99 {
private static class Inverted extends XYSeries {
List<XYDataItem> list = data;
public Inverted(Comparable key) {
super(key);
}
public void invert() {
double max = getMaxY();
for (XYDataItem item : list) {
item.setY(max - item.getYValue());
}
}
}
public static void main(String[] args) {
Inverted series = new Inverted("AAA needle");
series.add(0.0, 16);
series.add(-1.168, 15);
series.add(1.168, 15);
series.add(-1.219, 14);
series.add(1.219, 14);
series.add(-1.270, 13);
series.add(1.270, 13);
series.add(-1.321, 12);
series.add(1.321, 12);
series.add(-1.372, 11);
series.add(1.372, 11);
series.add(-1.422, 10);
series.add(1.422, 10);
series.add(-1.473, 9);
series.add(1.473, 9);
series.add(-1.524, 8);
series.add(1.524, 8);
series.add(-1.600, 7);
series.add(1.600, 7);
series.add(-1.712, 6);
series.add(1.712, 6);
series.add(-1.829, 5);
series.add(1.829, 5);
series.add(-1.918, 4);
series.add(1.918, 4);
series.add(-1.994, 3);
series.add(1.994, 3);
series.add(-2.068, 2);
series.add(2.068, 2);
series.add(-2.159, 1);
series.add(2.159, 1);
series.add(-2.261, 0);
series.add(2.261, 0);
series.invert();
XYSeriesCollection xyDataset = new XYSeriesCollection();
xyDataset.addSeries(series);
JFreeChart chart = ChartFactory.createXYLineChart("", "", "",
xyDataset, PlotOrientation.VERTICAL, true, false, false);
chart.setBackgroundPaint(Color.yellow);
XYPlot plot = (XYPlot) chart.getPlot();
XYAreaRenderer renderer = new XYAreaRenderer();
plot.setRenderer(0, renderer);
plot.setBackgroundPaint(Color.WHITE);
JFrame testframe = new JFrame("test chart");
testframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ChartPanel frame = new ChartPanel(chart){
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 600);
}
};
testframe.add(frame);
testframe.pack();
testframe.setVisible(true);
}
}
Upvotes: 2
Reputation: 2220
Try overriding the paintComponent method of JPanel, like so:
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class UpsideDownJPanel extends JPanel {
public UpsideDownJPanel() {}
public void paintComponent(Graphics graphics) {
Graphics2D g = (Graphics2D) graphics;
int x = this.getWidth() / 2;
int y = this.getHeight() / 2;
g.rotate(Math.toRadians(180.0), x, y);
super.paintComponent(g);
}
}
If my logic is correct this should flip everything inside the JPanel 180 degrees.
Upvotes: 3