tags:

views:

158

answers:

1

Hi all! Anybody know how can I repaint in a clone JPanel. Im using CLONE, so I can REPAINT() one, and the other will do the same automatically.

My code only paints the original JPanel if I move the mouse in the original or in the clone panel,

but If I move the mouse in the clone panel, this jpanel doesn't paint.

Thanks in advance

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

.clone() does not return a mirror of the JPanel but returns a copy of the object, so you really have 2 separate JPanel objects so actions in one will not automatically reflect in the other.

You could override all the actions in a component that inherits from JPanel with a reference to a .cloned() JPanel object and then route all methods to the other JPanel after calling super()

Bedwyr Humphreys
can you give me an example?
AcMe