我应该在 paintComponent 中使用什么来拖动和旋转图像?

What should I have in paintComponent to drag and rotate an image?

我处理学校作业已经有一段时间了。但我真的不明白我应该做什么。明天就要交作业了,感觉压力很大

任务是,我会得到一些照片,将它们放在 window 中,然后能够在它们周围移动并旋转。

最大的问题是我不知道如何管理 paintComponent()。 我读到的是它应该被称为自动 "when needed" 并且当你调用 repaint() 时。我发现很难让它工作。

主要class

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

public class JFrameC extends JFrame{

JPanel panel;
ArrayList <ThePhoto> oneArray = new  <ThePhoto> ArrayList();

   public JFrameC(){
       super("This window");

       setLayout(new BorderLayout());

       panel = new JPanel();
       panel.setBackground(Color.GREEN);
       panel.setLayout(null);

       add(panel);

       setSize(500,500);
       setVisible(true);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
   }

   public void addPicture(String name){

       oneArray.add(new ThePhoto(name, this));
       panel.add(oneArray.get(oneArray.size()-1).getJPanel());

   }    

   public void draw(JPanel p){


//One of the tasks is that the image is pressed to end up on top.
//I thought that if I sort of an ArrayList so I can keep track of which one
//is on top. Then be able to paint them in order.

       for(ThePhoto x : oneArray){

           if(x.getJPanel() == p && oneArray.indexOf(x) != 0){

               int i = oneArray.indexOf(x);

               for(;i > 0; i--){
                   ThePhoto temp = oneArray.get(i);
                   oneArray.set(i, oneArray.get(i-1));
                   oneArray.set(i-1, temp);
               }
               break;
           }
       }

       panel.validate();//I can not get this to work
       panel.repaint();             

       getContentPane().validate();//Or this.
       getContentPane().repaint();          
   }

   public void paintComponent(Graphics g){  
       //Is this right?
       //What should I write here?
   }

   public static void main(String[] args) {

       JFrameC j = new JFrameC();

       j.addPicture("one.gif");
       j.addPicture("two.gif");
       j.addPicture("three.gif");
       j.addPicture("four.gif");
   }
}

Class

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

public class ThePhoto{

   ImageIcon onePicture;
   JLabel l;
   JPanel p;
   JFrameC k;
   int posX = 10;
   int posY = 10;

   public ThePhoto(String name, JFrameC k){

       this.k = k;

       onePicture = new ImageIcon(name);

       l = new JLabel(onePicture);

       p = new JPanel();
       p.setLayout(new CardLayout());
       p.setBorder(null);
       p.setBackground(null);
       p.add(l);

       p.setBounds(posX, posY, 100, 100);
       p.addMouseListener(new HandleMouse(k, this));
       p.addMouseMotionListener(new HandleMouse(k, this));
   }

   public void setX(int x){posX = x;}
   public void setY(int y){posY = y;}
   public JPanel getJPanel(){return p;}

   public void paintComponent(Graphics g){  

           //Is this right?
           //What should I write here?

    }
}

鼠标事件Class

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.*;
import javax.swing.*;

public class HandleMouse extends MouseAdapter implements MouseMotionListener{

       JFrame k;
   ThePhoto b;

   public HandleMouse(JFrameC k, ThePhoto b){

       this.k = k;
       this.b = b;
   }

   public void mouseClicked (MouseEvent e) {

       k.draw((JPanel)e.getComponent());    
   }

   public void mouseDragged (MouseEvent e) {

       e.translatePoint(e.getComponent().getLocation().x, e.getComponent().getLocation().y);
       e.getComponent().setLocation(e.getX(), e.getY());

       b.setX(e.getX());
       b.setY(e.getY());

   }

   public void mouseReleased(MouseEvent e) {

       k.draw((JPanel)e.getComponent());
       }
}

为了更清楚地总结问题:

1.Is最好叫repaint()FramePanel?据我所知,在这两种情况下,所有 'in' 容器都将被重新粉刷。如果是这样,JFrame 应该更可取吗?

2.Is routine/usual/rule paintComponent()?

3.What 欢迎大家提出建议和批评。但请写得让初学者看得懂,不要有不必要的侮辱。

我明白没有人愿意做我的作业。但我只是征求一些建议,这样我才能变得更好。我也想写一下,我是新手,所以看起来我的代码应该是新手写的。

先解决单张图片的问题,然后再尝试多张图片。从这个example开始,用ImageIO.read()初始化一个image,用drawImage()渲染到paintComponent().

private final BufferedImage image = getImage();
private BufferedImage getImage() {
    try {
        return ImageIO.read(new URL(
            "http://i.imgur.com/kxXhIH1.jpg"));
    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
    return null;
}
…
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image,
        textPt.x - image.getWidth() / 2,
        textPt.y - image.getHeight() / 2, this);
}

您可以旋转图形上下文,如图所示 here