Java中数据和文本的旋转坐标平面

Java中数据和文本的旋转坐标平面,java,swing,plot,graphics2d,affinetransform,Java,Swing,Plot,Graphics2d,Affinetransform,我需要: 1.)移动原点并旋转坐标平面,以便x值从新原点向右移动,y值从新原点向上移动(在下面的代码中,新原点需要是内部蓝色矩形的左下角)。这将使我能够在下面的代码中绘制x、y坐标对上的点。 2.)在数据图的y轴上绘制tic标记的旋转标签 下面的代码设置了此问题。除了两个问题外,它是有效的: 1.)以左上角为原点绘制数据点,y值向下递减 2.)y轴上tic标记的标签未在屏幕上绘制 有谁能告诉我如何修复下面的代码,使其修复这两个问题,并执行上面第一段所描述的操作 代码位于以下两个java文件中:

我需要:
1.)移动原点并旋转坐标平面,以便x值从新原点向右移动,y值从新原点向上移动(在下面的代码中,新原点需要是内部蓝色矩形的左下角)。这将使我能够在下面的代码中绘制x、y坐标对上的点。
2.)在数据图的y轴上绘制tic标记的旋转标签

下面的代码设置了此问题。除了两个问题外,它是有效的:
1.)以左上角为原点绘制数据点,y值向下递减
2.)y轴上tic标记的标签未在屏幕上绘制

有谁能告诉我如何修复下面的代码,使其修复这两个问题,并执行上面第一段所描述的操作

代码位于以下两个java文件中:

DataGUI.java

import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;

class DataGUI extends JFrame{
DataGUI() {
    super("X,Y Plot");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setPreferredSize(new Dimension(800, 400));
    this.pack();
    this.setSize(new Dimension(800, 600));
    this.setLocationRelativeTo(null);


    setLayout(new GridLayout());
    ArrayList<Double> myDiffs = new ArrayList<Double>();
            myDiffs.add(25.0);
            myDiffs.add(9.0);
            myDiffs.add(7.0);
            myDiffs.add(16.0);
            myDiffs.add(15.0);
            myDiffs.add(6.0);
            myDiffs.add(2.0);
            myDiffs.add(8.0);
            myDiffs.add(2.0);
            myDiffs.add(27.0);
            myDiffs.add(14.0);
            myDiffs.add(12.0);
            myDiffs.add(19.0);
            myDiffs.add(10.0);
            myDiffs.add(11.0);
            myDiffs.add(8.0);
            myDiffs.add(19.0);
            myDiffs.add(2.0);
            myDiffs.add(16.0);
            myDiffs.add(5.0);
            myDiffs.add(18.0);
            myDiffs.add(23.0);
            myDiffs.add(9.0);
            myDiffs.add(4.0);
            myDiffs.add(8.0);
            myDiffs.add(9.0);
            myDiffs.add(3.0);
            myDiffs.add(3.0);
            myDiffs.add(9.0);
            myDiffs.add(13.0);
            myDiffs.add(17.0);
            myDiffs.add(7.0);
            myDiffs.add(0.0);
            myDiffs.add(2.0);
            myDiffs.add(3.0);
            myDiffs.add(33.0);
            myDiffs.add(23.0);
            myDiffs.add(26.0);
            myDiffs.add(12.0);
            myDiffs.add(12.0);
            myDiffs.add(19.0);
            myDiffs.add(14.0);
            myDiffs.add(9.0);
            myDiffs.add(26.0);
            myDiffs.add(24.0);
            myDiffs.add(13.0);
            myDiffs.add(19.0);
            myDiffs.add(2.0);
            myDiffs.add(7.0);
            myDiffs.add(28.0);
            myDiffs.add(15.0);
            myDiffs.add(2.0);
            myDiffs.add(5.0);
            myDiffs.add(17.0);
            myDiffs.add(2.0);
            myDiffs.add(16.0);
            myDiffs.add(19.0);
            myDiffs.add(2.0);
            myDiffs.add(31.0);
    DataPanel myPP = new DataPanel(myDiffs,this.getHeight(),this.getWidth());
    this.add(myPP);
    this.setVisible(true);// Display the panel.
}
public static void main(String[] args){
    DataGUI myDataGUI = new DataGUI();
    myDataGUI.setVisible(true);
}
}
import java.awt.*;
导入java.util.ArrayList;
导入javax.swing.*;
类DataGUI扩展了JFrame{
DataGUI(){
超级(“X,Y图”);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
此.setPreferredSize(新尺寸(800400));
这个包();
此.设置尺寸(新尺寸(800600));
此.setLocationRelativeTo(空);
setLayout(新的GridLayout());
ArrayList MyDiff=新的ArrayList();
MyDiff.add(25.0);
MyDiff.add(9.0);
MyDiff.add(7.0);
MyDiff.add(16.0);
MyDiff.add(15.0);
MyDiff.add(6.0);
MyDiff.add(2.0);
MyDiff.add(8.0);
MyDiff.add(2.0);
MyDiff.add(27.0);
MyDiff.add(14.0);
MyDiff.add(12.0);
MyDiff.add(19.0);
MyDiff.add(10.0);
MyDiff.add(11.0);
MyDiff.add(8.0);
MyDiff.add(19.0);
MyDiff.add(2.0);
MyDiff.add(16.0);
MyDiff.add(5.0);
MyDiff.add(18.0);
MyDiff.add(23.0);
MyDiff.add(9.0);
MyDiff.add(4.0);
MyDiff.add(8.0);
MyDiff.add(9.0);
MyDiff.add(3.0);
MyDiff.add(3.0);
MyDiff.add(9.0);
MyDiff.add(13.0);
MyDiff.add(17.0);
MyDiff.add(7.0);
MyDiff.add(0.0);
MyDiff.add(2.0);
MyDiff.add(3.0);
MyDiff.add(33.0);
MyDiff.add(23.0);
MyDiff.add(26.0);
MyDiff.add(12.0);
MyDiff.add(12.0);
MyDiff.add(19.0);
MyDiff.add(14.0);
MyDiff.add(9.0);
MyDiff.add(26.0);
MyDiff.add(24.0);
MyDiff.add(13.0);
MyDiff.add(19.0);
MyDiff.add(2.0);
MyDiff.add(7.0);
MyDiff.add(28.0);
MyDiff.add(15.0);
MyDiff.add(2.0);
MyDiff.add(5.0);
MyDiff.add(17.0);
MyDiff.add(2.0);
MyDiff.add(16.0);
MyDiff.add(19.0);
MyDiff.add(2.0);
MyDiff.add(31.0);
DataPanel myPP=新的DataPanel(mydiff,this.getHeight(),this.getWidth());
添加(myPP);
this.setVisible(true);//显示面板。
}
公共静态void main(字符串[]args){
DataGUI myDataGUI=newdatagui();
setVisible(true);
}
}
DataPanel.java(注意:我编辑了下面的代码以包含垃圾神的建议,但仍然不起作用。)

import java.awt.*;
导入java.awt.geom.AffineTransform;
导入javax.swing.*;
导入java.text.DecimalFormat;
导入java.text.NumberFormat;
导入java.util.*;
类DataPanel扩展了JPanel{
Insets ins;//保存面板的插图
ArrayList MyDiff;
double maxDiff=double.NEGATIVE_无穷大;
double minDiff=double.POSITIVE_无穷大;
双最大图;
数据面板(阵列列表差异、整数h、整数w){
set不透明(true);//确保面板不透明。
设置首选尺寸(新尺寸(w,h));
设置最小尺寸(新尺寸(w,h));
设置最大尺寸(新尺寸(w,h));
myDiffs=Diffs;
重新油漆();
此.setVisible(true);
}
受保护的void paintComponent(图形g){//Override paintComponent()方法。
超级组件(g);
//获取有关打印环境和文本的数据
int height=getHeight();
int width=getWidth();
ins=getInsets();
Graphics2D g2d=(Graphics2D)g;
FontMetrics FontMetrics=g2d.getFontMetrics();
字符串xString=(“x轴标签”);
int xStrWidth=fontMetrics.stringWidth(xString);
int xStrHeight=fontMetrics.getHeight();
字符串yString=“y轴标签”;
int-yStrWidth=fontMetrics.stringWidth(yString);
int-yStrHeight=fontMetrics.getHeight();
字符串titleString=“图形标题”;
int titleStrWidth=fontMetrics.stringWidth(titleString);
int titleStreight=fontMetrics.getHeight();
int leftMargin=ins.left;
//设置内部矩形的参数
int-hPad=10;
int-vPad=6;
int testLeftStartPlotWindow=ins.left+5+(3*yStrHeight);
int testInnerWidth=width-testLeftStartPlotWindow-ins.right-hPad;
getMaxMinDiffs();
getMaxPlotVal();
双增量=5.0;
int numTicks=(int)(maxPlot/increment);//将numTicks用于:余数、leftStartPlotWindow、innerRectangle+标签+记号
整数余数=测试宽度%numTicks;
int leftStartPlotWindow=testLeftStartPlotWindow余数;
System.out.println(“余数为:”+余数);
int底部衬垫=(3*xStrHeight)-vPad;
int blueTop=ins.bottom+(vPad/2)+titleStreight;
int blueHeight=高度底板blueTop;
int blueWidth=blueHeight;
int blueBottom=蓝色高度+蓝色顶部;
//绘制外矩形
g、 setColor(Color.red);
int redWidth=width-leftMargin-1;
g、 drawRect(左边距、ins.bottom、红色宽度、高度-ins.bottom-1
import java.awt.*;
import java.awt.geom.AffineTransform;
import javax.swing.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.*;

class DataPanel extends JPanel {
Insets ins; // holds the panel's insets
ArrayList<Double> myDiffs;
double maxDiff = Double.NEGATIVE_INFINITY;
double minDiff = Double.POSITIVE_INFINITY;
double maxPlot;

DataPanel(ArrayList<Double> Diffs, int h, int w){
    setOpaque(true);// Ensure that panel is opaque.
    setPreferredSize(new Dimension(w, h));
    setMinimumSize(new Dimension(w, h));
    setMaximumSize(new Dimension(w, h));
    myDiffs = Diffs;
    repaint();
    this.setVisible(true);
}

protected void paintComponent(Graphics g){// Override paintComponent() method.
    super.paintComponent(g);
    //get data about plotting environment and about text
    int height = getHeight();
    int width = getWidth();
    ins = getInsets();
    Graphics2D g2d = (Graphics2D)g;
    FontMetrics fontMetrics = g2d.getFontMetrics();
    String xString = ("x-axis label");
    int xStrWidth = fontMetrics.stringWidth(xString);
    int xStrHeight = fontMetrics.getHeight();
    String yString = "y-axis label";
    int yStrWidth = fontMetrics.stringWidth(yString);
    int yStrHeight = fontMetrics.getHeight();
    String titleString ="Title of Graphic";
    int titleStrWidth = fontMetrics.stringWidth(titleString);
    int titleStrHeight = fontMetrics.getHeight();
    int leftMargin = ins.left;
    //set parameters for inner rectangle
    int hPad=10;
    int vPad = 6;
    int testLeftStartPlotWindow = ins.left+5+(3*yStrHeight);
    int testInnerWidth = width-testLeftStartPlotWindow-ins.right-hPad;
    getMaxMinDiffs();
    getMaxPlotVal();
    double increment = 5.0;
    int numTicks = (int)(maxPlot/increment);//will use numTicks for: remainder, leftStartPlotWindow, innerRectangle+labels+tickmarks
    int remainder = testInnerWidth%numTicks;
    int leftStartPlotWindow = testLeftStartPlotWindow-remainder;
    System.out.println("remainder is: "+remainder);
    int bottomPad = (3*xStrHeight)-vPad;
    int blueTop = ins.bottom+(vPad/2)+titleStrHeight;
    int blueHeight = height-bottomPad-blueTop;
    int blueWidth = blueHeight;
    int blueBottom = blueHeight+blueTop;

    //plot outer rectangle
    g.setColor(Color.red);
    int redWidth = width-leftMargin-1;
    g.drawRect(leftMargin, ins.bottom, redWidth, height-ins.bottom-1);
    //write top label
    g.setColor(Color.black);
    g.drawString(titleString, leftStartPlotWindow+((blueWidth/2)-(titleStrWidth/2)), titleStrHeight);
    // fill, then plot, inner rectangle
    g.setColor(Color.white);
    g.fillRect(leftStartPlotWindow, blueTop, blueWidth, blueHeight);
    g.setColor(Color.blue);
    g.drawRect(leftStartPlotWindow, blueTop, blueWidth, blueHeight);
    //scale the diffs to fit window
    double Scalar = blueWidth/maxPlot;
    ArrayList<Double> scaledDiffs = new ArrayList<Double>();
    for(int e = 0;e<myDiffs.size();e++){scaledDiffs.add(myDiffs.get(e)*Scalar);}
    //plot the scaled Diffs
    AffineTransform at = g2d.getTransform();//save the graphics context's transform
    g2d.translate(leftStartPlotWindow, blueTop);//translate origin to bottom-left corner of blue rectangle
    g2d.scale(1, -1);//invert the y-axis
    for(int w = 0;w<scaledDiffs.size();w++){
        if(w>0){
            double prior = scaledDiffs.get(w-1);
            int priorInt = (int)prior;
            double current = scaledDiffs.get(w);
            int currentInt = (int)current;
            g2d.drawOval(priorInt, currentInt, 4, 4);
        }
    }
    g2d.setTransform(at);//restore the transform for conventional rendering
    //write x-axis label
    g.setColor(Color.red);
    g.drawString(xString, leftStartPlotWindow+((blueWidth/2)-(xStrWidth/2)), height-ins.bottom-vPad);
    //write y-axis label
    g2d.rotate(Math.toRadians(-90), 0, 0);//rotate text 90 degrees counter-clockwise
    g.drawString(yString, -(height/2)-(yStrWidth/2), yStrHeight);
    g2d.rotate(Math.toRadians(+90), 0, 0);//rotate text 90 degrees clockwise
    // draw tick marks on x-axis
    NumberFormat formatter = new DecimalFormat("#0.0");
    double k = (double)blueWidth/(double)numTicks;
    double iteration = 0;
    for(int h=0;h<=numTicks;h++){
        int xval = (int)(h*k);
        g.setColor(Color.red);
        g.drawLine(leftStartPlotWindow+xval, blueBottom+2, leftStartPlotWindow+xval, blueBottom+(xStrHeight/2));//draw tick marks
        g.drawString(formatter.format(iteration),leftStartPlotWindow+xval-(fontMetrics.stringWidth(Double.toString(iteration))/2),blueBottom+(xStrHeight/2)+13);
        iteration+=increment;
    }
    // draw tick marks on y-axis
    iteration = 0;
    for(int h=0;h<=numTicks;h++){
        int yval = (int)(h*k);
        g.setColor(Color.red);
        g.drawLine(leftStartPlotWindow-2, blueBottom-yval, leftStartPlotWindow-(yStrHeight/2), blueBottom-yval);//draw tick marks
        g2d.rotate(Math.toRadians(-90), 0, 0);//rotate text 90 degrees counter-clockwise
        g.drawString(formatter.format(iteration),leftStartPlotWindow-2,blueBottom-(fontMetrics.stringWidth(Double.toString(iteration))/2));
        g2d.rotate(Math.toRadians(+90), 0, 0);//rotate text 90 degrees clockwise
        iteration+=increment;
    }
}
void getMaxMinDiffs(){// get max and min of Diffs
    for(int u = 0;u<myDiffs.size();u++){
        if(myDiffs.get(u)>maxDiff){maxDiff = myDiffs.get(u);}
        if(myDiffs.get(u)<minDiff){minDiff = myDiffs.get(u);}
    }
}
void getMaxPlotVal(){
    maxPlot = maxDiff;
    maxPlot += 1;//make sure maxPlot is bigger than the max data value
    while(maxPlot%5!=0){maxPlot+=1;}//make sure maxPlot is a multiple of 5
}
}
g2d.drawOval(priorInt, currentInt, 4, 4);
g2d.drawOval(blueWidth - priorInt, blueHeight - currentInt, 4, 4);
Graphics2D g2d = (Graphics2D) g;
AffineTransform at = g2d.getTransform();
g2d.translate(w / 2, h / 2);
g2d.scale(1, -1);
g2d.setTransform(at);