2

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

如果我在原始面板或克隆面板中移动鼠标,我的代码只会绘制原始 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;
          } 
 }
4

1 回答 1

1

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

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

于 2010-02-08T16:35:57.793 回答