简体   繁体   English

如何在CLONE JPanel中使用paint()?

[英]How paint() in a CLONE JPanel?

Anybody know how can I repaint in a clone JPanel. 任何人都知道如何在克隆的JPanel中重新绘制。 Im using CLONE, so I can REPAINT() one, and the other will do the same automatically. 我正在使用CLONE,因此我可以一个进行REPAINT()操作,而另一个将自动执行相同操作。

My code only paints the original JPanel if I move the mouse in the original or in the clone panel, 仅当我在原始面板或克隆面板中移动鼠标时,我的代码才会绘制原始JPanel,

but If I move the mouse in the clone panel, this jpanel doesn't paint. 但是,如果我在“克隆”面板中移动鼠标,则此jpanel不会显示。

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

.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. .clone()不会返回JPanel的镜像,而是返回该对象的副本,因此您确实有2个独立的JPanel对象,因此一个对象中的操作不会自动反映到另一个对象中。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM