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

标签 java swing clone jpanel paint

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

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

最佳答案

.clone() 不返回 JPanel 的镜像,而是返回对象的副本,因此您实际上有 2 个独立的 JPanel 对象,因此一个中的操作不会自动反射(reflect)到另一个中。

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

关于java - 如何在 CLONE JPanel 中使用 paint()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2222914/

相关文章:

java - 使用动画调整 jPanels 的大小

java - 将 int 值分配给 JCheckBox

java - 如何克隆 BufferedImage

javascript - 克隆并更改类名 +1 和字段名称

Java:从 xml 文件中读取最后一个条目

java - Tomcat(嵌入),无需重启即可进行更改

java - 将 glArrayElement 与 LWJGL 结合使用

Java执行-o选项

Java Swing : Select specefic row of Jtable after filtering data

python - SQLAlchemy:分离对象的修改