2010-02-08 16 views
2

Quelqu'un sait comment je peux repeindre dans un clone JPanel. Im en utilisant CLONE, donc je peux REPAINT() un, et l'autre fera la même chose automatiquement.Comment paint() dans un CLONE JPanel?

Mon code ne peint que le JPanel original si je déplace la souris dans l'original ou dans le panneau de clone,

mais si je déplace la souris dans le panneau de clone, ce JPanel ne peint pas.

Merci à l'avance

CODE:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class ProcessorClone { 

    public static void main(String[] args) { 

    JFrame aWindow = new JFrame(); 
    aWindow.setBounds(300, 200, 300, 100); 
    aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //Container content = aWindow.getContentP 
    aWindow.setVisible(true); 

    CardViewer panel02=new CardViewer(); 
    CardViewer panel01= (CardViewer) panel02.clone(); 

    aWindow.setLayout(new BorderLayout()); 

    aWindow.add(panel01,BorderLayout.NORTH); 
    aWindow.add(panel02,BorderLayout.SOUTH); 

    panel01.setBackground(Color.RED); 
    panel02.setBackground(Color.blue); 

    panel01.repaint(); 
    panel02.repaint(); 

    panel01.validate(); 
    panel02.validate(); 

    } 
    } 

class CardViewer extends JPanel implements MouseListener,MouseMotionListener, Cloneable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JPanel mContentPaneBorder; 
    private JPanel mContentPane; 
    private JButton FileButton=new JButton("AAA"); 
    private Point p; 

    public CardViewer(){ 
     super(); 
     this.add(FileButton); 


    addMouseListener(this); 
    addMouseMotionListener(this); 

    } 
    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     System.out.println("mouseClicked"); 

    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent arg0) { 
     System.out.println("mousePressed"); 
     p = null; 
     repaint(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseDragged(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     System.out.println("mouseMoved"); 
     p = e.getPoint(); 
     this.repaint(); 
     this.validate(); 
    } 

    public void paint(Graphics g) { 
     System.out.println(g.getClass()); 
      if (p != null) { 
       Dimension d = getSize(); 
       int xc = d.width/2; 
       int yc = d.height/2; 
       g.drawLine(p.x, p.y, p.x, p.y); 
       this.setBackground(Color.pink); 
      } 

    } 
     public Object clone() { 

      // First make exact bitwise copy 
      CardViewer copy = null; 
     try { 
      copy = (CardViewer)super.clone(); 
     } catch (CloneNotSupportedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


      return copy; 
      } 
} 

Répondre

1

.clone() ne renvoie pas un miroir de la JPanel mais retourne une copie de l'objet, de sorte que vous avez vraiment deux objets JPanel séparés pour les actions dans l'un ne reflétera pas automatiquement dans l'autre.

Vous pouvez remplacer toutes les actions d'un composant qui hérite de JPanel avec une référence à un .cloned() objet JPanel puis acheminer toutes les méthodes pour les autres JPanel après avoir appelé super()

+0

pouvez-vous me donner une Exemple? – AcMe