2012-07-15 103 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