2016-03-27 11 views
-1

Okul görevinde uzun süredir çalıştım. Ama ne yapmam gerektiğini gerçekten anlayamıyorum. Ödev yarından kaynaklanıyor ve oldukça stresli hissediyorum.Bir resmi sürükleyip döndürmek için paintComponent uygulamasında nelere sahip olmam gerekir?

Görev şu ki, bazı resimler alacağım, bir pencerede bulunduracağım, daha sonra etrafta hareket edebilecek ve aynı zamanda dönebileceksiniz.

Büyük sorun şu ki nasıl yöneteceğimi bilmiyorum paintComponent(). Okuduğum şey, otomatik olarak "gerektiğinde" ve repaint() numaralı telefonu aramanız gerektiğidir. Onu işe almak için zor buluyorum.

bunuaramak en iyi 1.Is:

ana sınıfı

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

Sınıf

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 Sınıf

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

net yaşanan sorunlar Özetlemek gerekirseila Frame veya Panel? Anladığım kadarıyla, her iki durumda da, tekrar boyanacak olan konteynerde her şey var. Ve eğer öyleyse, JFrame tercih edilmelidir?

2. paintComponent()'da nelerin olması gerektiği konusunda herhangi bir rutin/normal/kural var mı?

3. Ne tavsiye ve eleştiri ne olursa olsun çok açıktır. Fakat lütfen, yeni başlayan bir kişinin anlaması ve gereksiz hakaret etmemesi için yazınız.

Kimsenin ödevimi yapmak istemediğini anlıyorum. Ama daha iyi olabilmek için sadece bazı tavsiyelerde bulunacağım. Ayrıca bir acemi olduğumu ve bu nedenle bir acemi tarafından yazılacak koduma benzediğimi yazmak istiyorum.

+2

' 'paintComponent' yöntemi içinde. Panelde boyadığınız için, panelin üzerinde 'repaint()' i çağırmalısınız. [Özel Boyama Yapma] 'ya göz atın (https://docs.oracle.com/javase/tutorial/uiswing/painting/) –

+1

Belki de [Özel Resim Yapma] ile başlamalısınız (http://docs.oracle.com/javase/tutorial/uiswing/painting /) ve [AWT ve Swing'de Boyama] (http://www.oracle.com/technetwork/java/painting-140037.html) resmin nasıl çalıştığını anlamak için – MadProgrammer

cevap

2

Birden çok görüntüyü denemeden önce sorunu tek bir görüntü için çözün. Bu example'dan başlayarak, image'u başlatmak için ImageIO.read()'u kullanın ve paintComponent() içinde oluşturmak için drawImage()'u kullanın.

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

Grafiksel içeriği, gösterildiği gibi here olarak döndürebilirsiniz. Her zaman `super.paintComponent (g) çağırmalıdır

image

İlgili konular