2010-02-08 2 views
2

Кто-нибудь знает, как я могу перекрасить в клон JPanel. Im использует CLONE, поэтому я могу REPAINT() один, а другой будет делать то же самое автоматически.Как paint() в CLONE JPanel?

Мой код только рисует оригинальный JPanel, если я двигаю мышь в оригинале или в панели клона,

, но если я двигаю мышь в панели клона, это JPanel не красит.

Заранее спасибо

КОД:

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

ответ

1

.clone() не возвращает зеркало JPanel, но возвращает копию объекта, так что вы на самом деле есть 2 отдельные JPanel объекты так действия в одном не будет автоматически отражать в другом.

Вы можете отменить все действия в компоненте, который наследуется от JPanel со ссылкой на .cloned() объект JPanel, а затем маршрут всех метод к другому JPanel после вызова супер()

+0

вы можете дать мне пример? – AcMe