如何在CLONE JPanel中绘制paint()?

时间:2010-02-08 16:05:55

标签: java swing clone jpanel paint

任何人都知道如何在克隆JPanel中重新绘制。我使用CLONE,所以我可以REPAINT()一个,另一个会自动执行相同的操作。

如果我在原版或克隆面板中移动鼠标,我的代码只绘制原始JPanel,

但如果我在克隆面板中移动鼠标,则此jpanel不会绘制。

提前致谢

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

1 个答案:

答案 0 :(得分:1)

.clone()不会返回JPanel的镜像,但会返回该对象的副本,因此您确实有2个单独的JPanel对象,因此一个中的操作不会自动反映在另一个中。

您可以覆盖从JPanel继承的组件中的所有操作,并引用.cloned()JPanel对象,然后在调用super()后将所有方法路由到另一个JPanel