2012-07-15 149 views
0

我有兩個類。第一個,JPanelImage,增加了Image到我的JPanel。第二個,myObjet,代表我想在我的Image上添加的對象。 Image可以移動並可以縮放。圖像上的對象在圖像移動時不會移動

問題是,當我移動圖像時,對象保持固定。

JImagePanel

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.MediaTracker; 
import java.awt.Panel; 
import java.awt.Toolkit; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

class JImagePanel extends Panel{ 
    private static final long serialVersionUID = 5375994938523354306L; 
    private MediaTracker tracker; 
    private Image img; 
    private Dimension imgSize,iniSize; 
    private int zoom = 0 ; 
    private int MouseX; 
    private int MouseY; 
    int transX=0; 
    int transY=0; 

    public JImagePanel(String file){ 
     //setSize(100,200); 
     img=Toolkit.getDefaultToolkit().getImage(file); 
    setLayout(null); 
     tracker=new MediaTracker(this); 

     tracker.addImage(img,0); 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       MouseX = e.getX(); 
       MouseY = e.getY(); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       transX += e.getX()-MouseX; 
       transY += e.getY()-MouseY; 
       MouseX = e.getX(); 
       MouseY = e.getY(); 

       repaint(); 
      } 
     }); 

     try{ 
      tracker.waitForAll(); 
     } 
     catch(Exception ie){} 
     imgSize=iniSize=new Dimension(img.getWidth(this),img.getHeight(this)); 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(imgSize); 
    } 

    public void paint(Graphics g){ 
     super.paint(g); 
     if(imgSize.width<=iniSize.width) { 
      imgSize=iniSize; 
     } 

     g.drawImage(this.img, (getWidth()-imgSize.width)/2+transX, (getHeight()-imgSize.height)/2+transY, imgSize.width,imgSize.height,this); 
    } 
    public void zoomIn(){ 
     int x=10*imgSize.width/100; 
     int y=10*imgSize.height/100; 
     imgSize=new Dimension(imgSize.width+x,imgSize.height+y); 
     if(imgSize.width>iniSize.width){ 
      setSize(imgSize); 
      getParent().doLayout(); 
     } 
     repaint(); 
    } 
    public void zoomOut(){ 
     int x=10*imgSize.width/100; 
     int y=10*imgSize.height/100; 
     imgSize=new Dimension(imgSize.width-x,imgSize.height-y); 
     if(getWidth()>iniSize.width) 
     { 
      setSize(imgSize); 
      getParent().doLayout(); 

     } 
     repaint(); 
    } 

    public int getZoom() { 
     return zoom; 
    } 

myObjet

import java.awt.BorderLayout; 

import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class myObjet extends JPanel { 

    JLabel lblName,lblAct,lblSeuil ; 
    JPanel panelObjet; 

    public myObjet(String NameObjet ,double activite ) 
    { 
     ImageIcon img = createImageIcon("images/Source.png"); 
     lblName = new JLabel(img); 
     lblAct = new JLabel(String.valueOf(activite)); 
     panelObjet = new JPanel(); 
     panelObjet.setToolTipText(NameObjet); 
     panelObjet.setLayout(new BorderLayout()); 
     panelObjet.add("North",lblName); 
     panelObjet.add("South",lblAct); 
     add(panelObjet); 
     isOpaque(); 
    } 

    public ImageIcon createImageIcon(String path) { 
     java.net.URL imgURL = getClass().getResource(path); 
     if (imgURL != null) { 
      return new ImageIcon(imgURL); 
     } else { 
      JOptionPane.showMessageDialog(null, "Cette image n'existe pas : " + path, "Erreur", JOptionPane.ERROR_MESSAGE); 
      // System.err.println("L'image n'est pas dans : " + path); 
      return null; 
     } 
    } 
    public boolean isOpaque() 
    { 
     return true ; 
    } 
} 

MYOBJECT單獨是,我增加了在該圖像的面板此對象。

下面是我如何的actionPerformed使用這些類

public static void (String [] args) 
    { 
imagePanel = new JImagePanel("/home/Image.png"); 
p = new JPanel(); 
     p.setLayout(new FlowLayout()); 
    // p.setBounds(0,0,0,0); 
     p.add(getImagePanel()); 
     ple2.add("Center",p); 

} 

2 /一個具體的例子:

public void actionPerformed(ActionEvent ev) { 



    Object sourceEv = ev.getSource() ; 




    if(sourceEv == action.jpfI.btnFrame[4]) 
    { 
     df = new DecimalFormat("0.00"); 


     int x = Integer.valueOf(action.jpfI.lblTxt[4].getText()); 
     int y =Integer.valueOf(action.jpfI.lblTxt[5].getText()) ; 
     x =(int)(x/0.26) ; 
     y =(int)(y/0.26): 


     objet = new myObjet("islem","0.002"); 
     objet.setBounds(x,y , 50,50); 


     action.getImagePanel().addImage(objet); 
     action.repaint(); 

    } 
+0

我可以想到一些問題,但我需要更多信息。 「myObject」窗格如何與圖像窗格關聯?它是被添加到圖像窗格還是被添加到一個公共容器? – MadProgrammer 2012-07-15 23:03:47

+0

我有一個例子 – islem 2012-07-16 21:32:19

回答

0

好吧,我遇到三個問題。

首先:圖像窗格上沒有佈局管理器。沒什麼大不了的,但是如果你不打算使用佈局管理器,你就要負責佈置任何子組件。我通過將以下內容添加到「myObjet」類來解決此問題(並且它位於錯誤的地方)。

Dimension size = getPreferredSize(); 
setBounds(0, 0, size.width, size.height); 

這真的應該由JImagePanel負責 - 或者添加布局管理器或者檢查doLayout方法。其次:JImagePanel是一個沉重的重量組件。如果可以的話,你應該避免混合重量和重量較輕的組件(除了其他方面外,還有Z順序問題)。我更新了JImagePanel從JPanel擴展。

Thridly:你應該很少必須重寫paint方法。在你的情況下,我可以理解你爲什麼這樣做,但是你最終做的是繪製在其他任何東西的頂部(並且混合了使用重量較大的組件的事實使問題複雜化)。

我改變了「paintComponent」的繪畫背景,並能夠很好地工作。我能夠移動圖像並使「myObjet」可見和靜止。

UPDATE

好了...

 public void mouseDragged(MouseEvent e) { 
      transX += e.getX() - MouseX; 
      transY += e.getY() - MouseY; 
      MouseX = e.getX(); 
      MouseY = e.getY(); 

      // Add this to your code 
      for (Component comp : getComponents()) { 

       comp.setLocation(transX, transY); 

      } 

      repaint(); 
     } 

事實上,一個更好的解決辦法是允許父容器來處理移動和設置圖像與圖像中的靜態對象窗格(我的窗格被設置爲靜態大小)。你在這裏運行的基本想法只需要移動到容器。

你需要處理的唯一的其他事情就是窗格的Z順序。

+0

謝謝,但你可以發佈新的代碼? 。 – islem 2012-07-17 21:27:00

+0

我想將所有對象移動到圖像。 – islem 2012-07-17 22:16:20

+0

查看更新代碼 – MadProgrammer 2012-07-17 22:55:53