如何在Java中使用paintComponent绘制多个对象,但旋转一个对象?

如何在Java中使用paintComponent绘制多个对象,但旋转一个对象?,java,Java,我正在用Java为我的CS类制作一个程序。我的老师几乎没有Java图形编程的经验,所以我求助于你们。我目前正在使用主面板的paintComponent方法绘制两个东西,一个是我的大炮的矩形,以后可能会替换为一个图像,另一个是一个炮弹的.png文件。我使用图形g将其转换为图形2D,在屏幕上绘制大炮和球。然后我旋转,但是,大炮和球旋转,不仅仅是大炮。非常感谢任何提示、建议或有用的教程 这是我的代码注释掉的链接是我获得某些代码的地方,忽略它们: package Cannon; import

我正在用Java为我的CS类制作一个程序。我的老师几乎没有Java图形编程的经验,所以我求助于你们。我目前正在使用主面板的paintComponent方法绘制两个东西,一个是我的大炮的矩形,以后可能会替换为一个图像,另一个是一个炮弹的.png文件。我使用图形g将其转换为图形2D,在屏幕上绘制大炮和球。然后我旋转,但是,大炮和球旋转,不仅仅是大炮。非常感谢任何提示、建议或有用的教程

这是我的代码注释掉的链接是我获得某些代码的地方,忽略它们:

    package Cannon;

import java.awt.geom.Point2D;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class NewMain{

public static void main(String[] args) {
FraMainWindow frame = new FraMainWindow();
}
}

class FraMainWindow extends JFrame {
DrawCannon pnlCannon = new DrawCannon();
ButtonPannel pnlButtons = new ButtonPannel();
public FraMainWindow() {
this.setDefaultCloseOperation(JFrame.EXI…
this.setTitle("Super Mario Cannon Bro's");
this.setSize(900, 550);
this.setLayout(new BorderLayout());
this.add(pnlCannon, BorderLayout.CENTER);
this.add(pnlButtons, BorderLayout.SOUTH);
MouseMovement mouseMove = new MouseMovement();
MouseAction mouseClick = new MouseAction();
pnlCannon.addMouseMotionListener(mouseMo…
pnlCannon.addMouseListener(mouseClick);
FireButton actnFire = new FireButton();
pnlButtons.btnFire.addActionListener(act…
this.setVisible(true);
}

public class DrawCannon extends JPanel{
Rectangle.Float rectCannon = new Rectangle.Float(30, 450, 50, 10);
Image imgBall=new ImageIcon("ball.png").getImage();
double dAngle = 0;
boolean isFired = false;
public void addCannonBall(){
isFired=true;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_… RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_… RenderingHints.VALUE_RENDER_QUALITY);//A… Aliasing from http://www.java2s.com/Code/Java/2D-Graph…
g2d.rotate(0 - dAngle, rectCannon.getX(), rectCannon.getY() + 5);
g2d.fill(rectCannon);
if(isFired){
g2d.drawImage(imgBall, 0, 0, null);
}
//Dimension size = getSize();
}
}

public class ButtonPannel extends JPanel {
JButton btnFire = new JButton("Fire!");
ButtonPannel() {
this.add(btnFire);
}
}

public class FireButton implements ActionListener {
public void actionPerformed(ActionEvent e) {
pnlCannon.addCannonBall();
System.out.println("Fire ZE MISSILES");
}
}
public class MouseMovement implements MouseMotionListener {

public void mouseDragged(MouseEvent e) {
double dBase, dHeight, dAngle;
dBase = e.getX() - pnlCannon.rectCannon.getX();
dHeight = pnlCannon.rectCannon.getY() - 5 - e.getY() + 10;
dAngle = Math.atan2(dHeight, dBase);
pnlCannon.dAngle = dAngle;
pnlCannon.repaint();
}//http://download.oracle.com/javase/tutori…

public void mouseMoved(MouseEvent e) {
}
}

public class MouseAction implements MouseListener {

public void mousePressed(MouseEvent e) {
double dBase, dHeight, dAngle;
dBase = e.getX() - pnlCannon.rectCannon.getX();
dHeight = pnlCannon.rectCannon.getY() - 5 - e.getY() + 10;
dAngle = Math.atan2(dHeight, dBase);
pnlCannon.dAngle = dAngle;
pnlCannon.repaint();
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {
} // From http://www.rgagnon

在拔出大炮后和拔出球前,必须取消旋转:

在执行旋转之前,可以尝试保存变换,然后再次将其设置回原位。此示例来自Java文档中的setTransform:

// Get the current transform
 AffineTransform saveAT = g2.getTransform();
 // Perform transformation
 g2d.transform(...);
 // Render
 g2d.draw(...);
 // Restore original transform
 g2d.setTransform(saveAT);
尝试移动此位:

if(isFired){
g2d.drawImage(imgBall, 0, 0, null);
}
在这一行之前:

g2d.rotate(0 - dAngle, rectCannon.getX(), rectCannon.getY() + 5);

应用于图形2D的任何转换都会影响从这一点开始的任何内容,因此您必须在需要时小心应用转换,或者在不需要转换之前取消应用转换。

YESSS!谢谢你,先生!我已经尝试解决这个问题好几天了,你终于解决了!谢谢