2016-03-27 3 views
-1

J'ai travaillé avec l'école depuis un certain temps maintenant. Mais je ne peux pas vraiment comprendre ce que je devrais faire. L'affectation est due demain et je me sens très stressé.Que devrais-je avoir dans paintComponent pour faire glisser et faire pivoter une image?

La tâche est, je vais obtenir quelques photos, les avoir dans une fenêtre, puis être en mesure de se déplacer autour d'eux et aussi être capable de tourner. Le gros problème est que je ne sais pas comment je vais gérer paintComponent(). Ce que je lis, c'est qu'il devrait être appelé automatique "en cas de besoin" et quand vous appelez repaint(). J'ai du mal à le faire fonctionner.

La classe principale

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

Classe

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? 

    } 
} 

MouseEvent Classe

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

Pour résumer les questions plus claires:

1.Le qu'il valait mieux appeler repaint() à Frame ou Panel? Comme, je comprends que c'est dans les deux cas tout ce qui dans le conteneur sera repeint. Et si oui, JFrame devrait-il être préférable?

2. Y a-t-il une règle/habituelle/règle sur ce qui devrait être dans le paintComponent()?

3.Quels conseils et critiques sont les bienvenus. Mais s'il vous plaît écrivez pour qu'un débutant comprenne et pas d'insultes inutiles. Je comprends que personne ne veut faire mes devoirs. Mais je demande seulement quelques conseils pour que je puisse aller mieux. Je veux aussi écrire que je suis novice et que par conséquent mon code doit être écrit par un novice.

+2

Vous devez toujours appeler 'super.paintComponent (g)' l'intérieur de la méthode 'paintComponent'. Puisque vous peignez sur le panneau, vous devriez appeler 'repaint()' sur le panneau lui-même. Consultez [Performing Custom Painting] (https://docs.oracle.com/javase/tutorial/uiswing/painting/) –

+1

Peut-être que vous devriez commencer par [Performing Custom Painting] (http://docs.oracle.com/javase/tutorial/uiswing/painting /) et [Peinture dans AWT et Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) pour comprendre comment la peinture fonctionne – MadProgrammer

Répondre

2

Résolvez le problème pour une seule image avant d'essayer plusieurs images. À partir de ce example, utilisez ImageIO.read() pour initialiser un image et utilisez drawImage() pour le rendre en paintComponent(). Vous pouvez faire pivoter le contexte graphique comme indiqué here.

image