求助!!Swing 如何旋转所画的图形

FallinOut 2010-04-11 08:22:58
比如说用Graphics画了一个正方形在JPanel上,如何将该正方形任意角度旋转??
...全文
301 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
truediego 2010-04-12
  • 打赏
  • 举报
回复
试试看吧



package to.shin.sai;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test4Rotate extends JFrame {
private static final long serialVersionUID = 1L;

public static void main(String[] args) {
new Test4Rotate();
}

public Test4Rotate() {
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final MyPanel mp = new MyPanel();
getContentPane().add(mp);

mp.addMouseListener(new MouseAdapter() {

@Override
public void mousePressed(MouseEvent mouseevent) {
int diagonal = (int)(50/Math.sin(Math.toRadians(45)));
int x = 5 + (diagonal-50)/2;
int y = 5 + (diagonal-50)/2;
mp.bi = new BufferedImage(diagonal + 10 , diagonal + 10, BufferedImage.TRANSLUCENT);
Graphics g = mp.bi.getGraphics();
g.setColor(Color.red);
g.drawLine(x, y, x+50, y);
g.setColor(Color.blue);
g.drawLine(x+50, y, x+50, y+50);
g.setColor(Color.green);
g.drawLine(x, y, x, y+50);
g.setColor(Color.orange);
g.drawLine(x, y+50, x+50, y+50);
mp.repaint();
}
});

JButton jb = new JButton();
jb.setText("right 15°");
jb.setSize(80, 20);
jb.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
mp.rotate = (mp.rotate + 15) % 360;
mp.repaint();
}
});
mp.add(jb);


setVisible(true);
}

class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage bi = null;
private double rotate = 0;
AffineTransform trans = null;
private Image back = null;

public MyPanel() {
super();
setOpaque(false);
trans = new AffineTransform();
try {
back = ImageIO.read(new File("c:\\1.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public void paintComponent(Graphics g) {
g.drawImage(back, 0, 0, 500, 300, null);
if (null != bi) {
Graphics2D gg = (Graphics2D)g;
trans.setToIdentity();
trans.setToRotation(Math.toRadians(rotate), bi.getWidth()/2, bi.getHeight()/2);
//gg.drawImage(back, trans, null);
gg.drawImage(bi, trans, null);
}
super.paintComponent(g);

}

}

}

truediego 2010-04-12
  • 打赏
  • 举报
回复
把正方形画在空image上,然后旋转image
b11ght 2010-04-12
  • 打赏
  • 举报
回复
这个关注一下。
liujun3512159 2010-04-12
  • 打赏
  • 举报
回复
学习一下
truediego 2010-04-12
  • 打赏
  • 举报
回复
修正个bug


private double calAngle(int x, int y, double A) {
// 计算起始点象限
int quadrant = 1;
int tempY = 0;
if (startX >= coorX && startY <= coorY)
quadrant = 1;
else if (startX < coorX && startY <= coorY)
quadrant = 2;
else if (startX < coorX && startY > coorY)
quadrant = 3;
else if (startX >= coorX && startY > coorY)
quadrant = 4;

tempY = (x - coorX) * (startY-coorY) / (startX-coorX) + coorY;
switch (quadrant) {
case 1:
case 4:
if (tempY > y)
return -A;
break;
case 2:
case 3:
if (tempY < y)
return -A;
break;
}
return A;

}
FallinOut 2010-04-12
  • 打赏
  • 举报
回复
谢谢楼上各位,学习了
truediego 2010-04-12
  • 打赏
  • 举报
回复
稍微升级了一下,鼠标点着旋转
可惜旋转之后会失真



package to.shin.sai;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test4Rotate extends JFrame {
private static final long serialVersionUID = 1L;
int startX = -1;
int startY = -1;
int coorX = 0;
int coorY = 0;

public static void main(String[] args) {
new Test4Rotate();
}

public Test4Rotate() {
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final MyPanel mp = new MyPanel();
mp.setLayout(null);
getContentPane().add(mp);

int diagonal = (int) (100 / Math.sin(Math.toRadians(45)));
int x = (diagonal - 100) / 2;
int y = (diagonal - 100) / 2;
BufferedImage bi = new BufferedImage(diagonal, diagonal, BufferedImage.TRANSLUCENT);
Graphics g = bi.getGraphics();
g.setColor(Color.red);
g.drawLine(x, y, x + 100, y);
g.setColor(Color.blue);
g.drawLine(x + 100, y, x + 100, y + 100);
g.setColor(Color.green);
g.drawLine(x, y, x, y + 100);
g.setColor(Color.orange);
g.drawLine(x, y + 100, x + 100, y + 100);

final MyLabel ml = new MyLabel(bi);
ml.setBounds(50, 50, diagonal, diagonal);
ml.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseevent) {
ml.dragging = true;
startX = mouseevent.getX();
startY = mouseevent.getY();
}

@Override
public void mouseReleased(MouseEvent mouseevent) {
ml.dragging = false;
startX = -1;
startY = -1;
ml.img = ml.imgIcon;
repaint();
super.mouseReleased(mouseevent);
}

});
ml.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent mouseevent) {
if (ml.dragging) {
// 根据余弦定理求得旋转角度
int newPX = mouseevent.getX();
int newPY = mouseevent.getY();

double a2 = Math.pow(newPX - startX, 2) + Math.pow(newPY - startY, 2);
double b2 = Math.pow(newPX - coorX, 2) + Math.pow(newPY - coorY, 2);
double c2 = Math.pow(startX - coorX, 2) + Math.pow(startY - coorY, 2);
// cosA=(b2+c2-a2)/2bc
double A = Math.acos((b2 + c2 - a2) / (2 * Math.sqrt(b2) * Math.sqrt(c2)));
ml.rotate(calAngle(newPX, newPY, A));
}
super.mouseMoved(mouseevent);
}
});
mp.add(ml);

coorX = ml.getWidth() / 2;
coorY = ml.getHeight() / 2;

setVisible(true);
}

/**
* 计算角度(正负)
*
* @param x
* @param y
* @param A
* @return
*/
private double calAngle(int x, int y, double A) {
// 计算起始点象限
int quadrant = 1;
int tempY = 0;
if (startX >= coorX && startY <= coorY)
quadrant = 1;
else if (startX < coorX && startY <= coorY)
quadrant = 2;
else if (startX < coorX && startY > coorY)
quadrant = 3;
else if (startX >= coorX && startY > coorY)
quadrant = 4;

switch (quadrant) {
case 1:
case 4:
tempY = x * startY / startX;
if (tempY > y)
return -A;
break;
case 2:
case 3:
tempY = x * startY / startX;
if (tempY < y)
return -A;
break;
}
return A;

}

class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image back = null;

public MyPanel() {
super();
setOpaque(false);
try {
back = ImageIO.read(new File("c:\\1.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void paintComponent(Graphics g) {
g.drawImage(back, 0, 0, 500, 300, null);
super.paintComponent(g);
}

}

class MyLabel extends JLabel {
private static final long serialVersionUID = 1L;
private BufferedImage img = null;
private BufferedImage imgIcon = null;
AffineTransform trans = null;
boolean dragging = false;

public MyLabel(BufferedImage bi) {
super(new ImageIcon(bi));
setOpaque(false);
trans = new AffineTransform();
this.img = bi;
}

public void rotate(double rotate) {
if (null != img) {
imgIcon = new BufferedImage(img.getWidth(), img.getHeight(),
BufferedImage.TRANSLUCENT);
Graphics2D gg = (Graphics2D) imgIcon.getGraphics();
trans.setToIdentity();
trans.setToRotation(rotate, img.getWidth() / 2, img.getHeight() / 2);
gg.drawImage(img, trans, null);
setIcon(new ImageIcon(imgIcon));
}
}

@Override
public void paintComponent(Graphics g) {
if (dragging) {
//描绘旋转圆心
Graphics2D gg = (Graphics2D) g;
gg.setStroke(new BasicStroke(2));
gg.setColor(Color.white);
gg.drawOval(getWidth() / 2 - 2, getHeight() / 2 - 2, 4, 4);
}
super.paintComponent(g);
}

}

}

b11ght 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 truediego 的回复:]
试试看吧


Java code


package to.shin.sai;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java……
[/Quote]
这个的确可以,帅啊。
FallinOut 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wd9053 的回复:]

你可以定义一个正方形类,
含正方形中心的x,y坐标,边长和旋转角度,然后绘图时计算各点的实际坐标
[/Quote]
这个我试过了,算出来的各点坐标都是double型的,转成int难免会有偏差,这样多旋转几次,正方形就变得扭曲了。。。
wd9053 2010-04-11
  • 打赏
  • 举报
回复
你可以定义一个正方形类,
含正方形中心的x,y坐标,边长和旋转角度,然后绘图时计算各点的实际坐标

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧