2016-03-27 4 views
-1

Ich habe schon lange mit dem Schulauftrag gearbeitet. Aber ich kann nicht wirklich verstehen, was ich tun soll. Die Aufgabe ist morgen fällig und ich fühle mich ziemlich gestresst.Was soll ich in paintComponent haben, um ein Bild zu ziehen und zu drehen?

Die Aufgabe ist, ich werde ein paar Bilder bekommen, sie in einem Fenster haben, dann in der Lage sein, sie zu bewegen und auch zu drehen. Das große Problem ist, dass ich nicht weiß, wie ich paintComponent() verwalten werde. Was ich lese ist, dass es automatisch aufgerufen werden sollte "wenn benötigt" und wenn Sie repaint() anrufen. Ich finde es schwierig, es zur Arbeit zu bringen.

Die Hauptklasse

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

Klasse

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-Klasse

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

, um die Probleme klarer zusammenfassen:

es am besten 1.Isnennenbis Frame oder Panel? Wie ich es verstehe, ist es in beiden Fällen alles "in" dem Container, der neu gestrichen wird. Und wenn ja, sollte JFrame vorzuziehen sein?

2. Gibt es eine Routine/Normale/Regel auf was sollte in der paintComponent() sein?

3.What Beratung und Kritik ist sehr willkommen. Aber schreiben Sie bitte so, dass ein Anfänger versteht und keine unnötigen Beleidigungen.

Ich verstehe, dass niemand meine Hausaufgaben machen will. Aber ich bitte nur um Rat, damit ich besser werden kann. Ich möchte auch schreiben, dass ich ein Neuling bin und deshalb aussieht, als würde mein Code von einem Anfänger geschrieben werden.

+2

Sie sollten immer rufen 'super.paintComponent (g)' in der 'paintComponent' Methode. Da Sie auf dem Panel malen, sollten Sie 'repaint()' auf dem Panel selbst aufrufen. Weitere Informationen finden Sie unter [Durchführen von benutzerdefinierten Bildern] (https://docs.oracle.com/javase/tutorial/uiswing/painting/) –

+1

Vielleicht sollten Sie mit [Durchführen von benutzerdefinierten Bildern] (http://docs.oracle.com/javase) beginnen/tutorial/uiswing/painting /) und [Malen in AWT and Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) um zu verstehen, wie Malerei funktioniert – MadProgrammer

Antwort

2

Lösen Sie das Problem für ein einzelnes Bild, bevor Sie mehrere Bilder versuchen. Beginnen Sie mit dieser example, verwenden Sie ImageIO.read(), um eine zu initialisieren, und verwenden Sie drawImage(), um es in paintComponent() zu rendern.

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

Sie können den Grafikkontext wie gezeigt drehen here.

image

Verwandte Themen