user2965258
user2965258

Reputation: 147

rotate a JPanel to display it upside down when launched?

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

Answers (2)

trashgod
trashgod

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

image

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

Kieran
Kieran

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

Related Questions