2016-04-03 20 views
0

Sadece birkaç BufferedImages görüntüleyebilecek ve birbirinizin üzerine koyabileceğiniz küçük bir başlangıç ​​programı yazmaya çalışıyorum. Ancak ekrandaki görüntülerin doğru şekilde üst üste gelmesi için sorun yaşıyorum.BufferedImages'm neden doğru şekilde çakışmıyor?

Fare imlecinin bulunduğu konum içinde birkaç görüntü olsa bile, fare imleciyle seçilen görüntünün taşınan dosya olmasını istiyorum.

Yapmakta zorlandığım şey budur; Üstteki görüntüyü yalnızca 1 görüntü altında olduğunda seçer, bu nedenle yalnızca iki görüntü yığıldığında çalışır. Bununla birlikte, her biri bir konum paylaşan yığılmış veya daha fazla üç görüntü varsa ve görüntüyü üste taşımaya çalışırsam, seçili olanın ya da yalnızca (rastgele) herhangi bir şekilde göründüğü gibi yığının alt tarafındaki yığını seçer. görüntü ama hareket etmek için üst olanı. Bu neden? Birçoğu yığılmış olsa bile, üst tarafın tıklandığında seçili kalmasını istiyorum.

Bu

benim kodudur: Bu kod kötü ise

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collection; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 


class Image { 

    private int x; 
    private int y; 
    private BufferedImage front, back; 
    private StringBuffer filepath; 
    private boolean isTurned; 

    public Image(int x, int y, String filepath) throws IOException { 
     this.filepath = new StringBuffer(filepath); 
     this.x = x; 
     this.y = y; 
     this.front = ImageIO.read(new File(String.valueOf(filepath))); 
     this.back = ImageIO.read(new File(String.valueOf("images/back.gif"))); 
    } 

    public void draw(Graphics g){ 

     g.drawImage(front, x, y, null); 

    } 

    public void undraw (Graphics g, Color c){ 
     g.setColor(c); 
     g.fillRect(x,y, front.getWidth(), front.getHeight()); 

    } 

    public boolean containsXY (int x, int y){ 

     if ((this.x <= x) && (x <= (this.x+this.front.getWidth())) && (this.y <= y) && (y <= (this.y+this.front.getHeight())) ){ 

      return true; 
     } 

     return false; 
    } 

    public void move (Graphics g, int x, int y) { 

     undraw(g, Color.WHITE); 
     this.x = x-(this.front.getWidth()/2); 
     this.y = y-(this.front.getHeight()/2); 
     draw(g); 
    } 

    public String getFilePath(){ 
     return String.valueOf(filepath); 
    } 

    public int getX(){ 
     return x; 
    } 

    public int getY(){ 
     return y; 
    } 

    public void turn(Graphics g) throws IOException { 

     if (isTurned) { 

      undraw(g, Color.WHITE); 
      front = ImageIO.read(new File(String.valueOf(filepath))); 
      draw(g); 
      isTurned = false; 
     } 

     else { 

      undraw(g, Color.WHITE); 
      front = back; 
      draw(g); 
      isTurned = true; 
     } 
    } 

} 



class PaintSurface extends JLabel implements MouseListener, MouseMotionListener { 

    private int x, y; 
    private JButton browse; 
    private Collection<Image> images = new ArrayList<Image>(); 
    private final JFileChooser fc = new JFileChooser(); 
    private Image selected; 
    private boolean drawOnce; 
    private Image[] initialImages = new Image[8]; 

    public PaintSurface(JButton b){ 
     browse = b; 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     browse.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 

       int x = fc.showOpenDialog(browse); 

       if (x == JFileChooser.APPROVE_OPTION){ 
        try { 
         buttonPressed(fc); 

        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
       } 

       else if (x ==JFileChooser.CANCEL_OPTION){ 
        System.out.println("No file selected."); 
       } 
      } 
     }); 
    } 

    public void paintComponent (Graphics g){ 
     super.paintComponent(g); 

     if (!drawOnce) { 
      try { 
       drawStartUpImages(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     for (Image i: images){ 
      i.draw(g); 

     } 

     drawOnce = true; 

    } 

    public void drawStartUpImages() throws IOException { 

     initialImages[0] = new Image(0, 100, "images/blab.gif"); 
     initialImages[1] = new Image(100, 100, "images/fred.gif"); 
     initialImages[2] = new Image(200, 100, "images/gira.gif"); 
     initialImages[3] = new Image(300, 100, "images/katt.gif"); 
     initialImages[4] = new Image(0, 300, "images/pear.gif"); 
     initialImages[5] = new Image(100, 300, "images/peli.gif"); 
     initialImages[6] = new Image(200, 300, "images/stef.gif"); 
     initialImages[7] = new Image(300, 300, "images/stru.gif"); 

     for (int i = 0; i<8; i++) { 
      addImage(initialImages[i]); 
      repaint(); 
     } 



    } 

    public void addImage(Image i){ 
     images.add(i); 

     Graphics g = getGraphics(); 
     i.draw(g); 


    } 

    public void buttonPressed(JFileChooser fc) throws IOException { 


     File selectedFile = fc.getSelectedFile(); 
     String filepath = String.valueOf(selectedFile.getAbsolutePath()); 
     Image i = new Image(x, y, filepath); 
     selected = i; 
     addImage(i); 


     repaint(); 

    } 

    public Image findImage(int x, int y){ 

     for (Image i: images){ 
      if (i.containsXY(x, y)){ 
       return i; 

      } 

     } 
     return null; 
    } 

    public void moveImage (Image i, int x, int y) { // 

     i.move(getGraphics(), x, y); 
    } 

    public boolean removeImage(Image i){ 

     Graphics g = getGraphics(); 
     i.undraw(g, Color.WHITE); 

     return images.remove(i); 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 
     //selected = findImage(e.getX(), e.getY()); 

     if (selected != null && findImage(x,y) == selected) { 

      Graphics g = getGraphics(); 
      try { 
       selected.turn(g); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 

     if (findImage(e.getX(), e.getY()) != null){ 
      selected = findImage(e.getX(), e.getY()); 
     } 

     if ((findImage(e.getX(), e.getY()) != null && findImage(e.getX(), e.getY()) == selected)){ 

      removeImage(selected); 
      addImage(selected); 

     } 

     if ((findImage(e.getX(), e.getY()) != null && findImage(e.getX(), e.getY()) != selected)) { 


      try { 
       selected = new Image(findImage(e.getX(), e.getY()).getX(), findImage(e.getX(), e.getY()).getY(), findImage(e.getX(), e.getY()).getFilePath()); 
       removeImage(findImage(e.getX(), e.getY())); 
       addImage(selected); 

      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 


    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 

     if (selected != null) { 
      moveImage(selected,x,y); 
      repaint(); 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 

    } 
} 
class GUI extends JFrame { 

    public GUI(){ 
     super("ImageApp"); 

     JLabel instruction = new JLabel("Clicking on the screen will set the location for the next added image."); 
     JButton browse = new JButton("Add image"); 
     JButton line = new JButton("Line up"); 
     JPanel panel1 = new JPanel(); 
     JLabel panel2 = new PaintSurface(browse); 
     panel1.setLayout(null); 
     panel2.setBackground(Color.WHITE); 
     instruction.setAlignmentX(CENTER_ALIGNMENT); 

     getContentPane().setBackground(Color.WHITE); 
     getContentPane().add("North", instruction); 
     getContentPane().add("South", browse); 

     add(panel2); 
     setBounds(300,0,800,800); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setVisible(true); 

    } 





} 


public class PhotoApp extends GUI { 

    public static void main (String[] args){ 
     GUI PhotoApplication = new GUI(); 
    } 
} 

Affet beni, sadece düzgün çalışması için çakışma almaya çalışıyorum. Bence sorun PaintSurface sınıfında, Mouselistener MousePressed ve MouseDragged işlevleri içinde ortaya çıkıyor. Çok çalıştım ama üstteki resmi başka bir resim görüntülediğinde üst resmi seçmeye devam edemiyorum. Altından birini seçer ve en üstteki olarak yeniden çizer. Söylediğim gibi, sadece iki resim birbirinin üzerine yığıldığında çalışır, ancak o zaman tıklattığımda altındakileri seçmez. Çakışmayı nasıl doğru şekilde çalıştığımı bilen var mı?

cevap

0

Sorun şu ki, findImage() yönteminiz her zaman ArrayList ürününüzde ilk eşleşmeyi döndürür. senin mousePressed() yöntemde

ilk findImage() için selected kurmak ve selected == findImage() böylece her zaman doğru olacaktır eğer sonradan sen kontrol ediyoruz. Daha sonra ArrayList görüntü kaldırıyor ve sonunda yeniden ekleyin, böylece bu konumda birden fazla görüntü varsa, sonraki her zaman yan tümcesi doğru olacağından eklemek, çünkü seçildiniz Görüntü şu anda ve findImage(), bu konumda başka bir Görüntü döndürecektir. Yapabileceğin tüm

İlk: mousePressed başında

if (findImage(e.getX(), e.getY()) == null) { return; }

It `çünkü her maddede ise.

Bundan sonra böyle bir şey yapmak mümkün olacaktır:

if (findImage(e.getX(), e.getY()) == selected)){ [...] } else { [...] }

şimdi tek orijinal ait hükümler an infaz edilecektir.

Bu küçük yardımla sorununuzu çözebilirsiniz.

+0

Yardımlarınız için teşekkür ederiz, ancak hala çalışmıyor. Söylediğin yönteme söylediklerimi değiştirdim ve şimdi sadece 2 resim altta bir tane yığıldığında bile seçilen resmi değiştiriyor? – user5846939

+0

Bunu yaptım: 'if (findImage (e.getX(), e.getY()) == null { dönüş; } eğer ((findImage (e.getX), e.getY()) == selected)) { removeImage (seçili); addImage (selected); Başka } { deneyin { seçilen = Yeni Resim (findImage (e.getX(), e.getY()). GetX(), findImage (e.getX(), e.getY()). getY(), findImage (e.getX(), e.getY()) getFilePath()); removeImage (findImage (e.getX(), e.getY())); addImage (selected); } catch (IOException e1) { e1.printStackTrace(); } } ' – user5846939

+0

değişiklik findImage aşağıdaki yöntem konum: 'halka Resim findImage (int x, int y) {için (int i = images.size() - 1; i> = 0; i -) { (i.containsXY (x, y)) {ii dönüşü; } } dönüş null; } ' – Dimi

İlgili konular