首页 > 解决方案 > 当我通过另一个面板时如何更改面板的颜色?

问题描述

我正在创建一个代码,我需要将面板颜色更改为当我通过它时仍然按下的颜色。例如,假设我按下一个绿色面板并将其拖到另一个面板上,这个面板应该是绿色的。但是,它并非每次都有效,例如有时它确实会改变颜色,但有时却不会。

import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.util.Random;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.*;
import javax.swing.event.MouseInputListener;

public class Etabli extends JFrame {
    
    JPanel paneprinci;
    CarrePanel selected;
    public Etabli() {
        this.setVisible(true);
        setTitle("Cadre");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        paneprinci=new JPanel(null);
        setSize(600,600);
        selected=new CarrePanel();
        for (int i=0;i<10;i++) {
            paneprinci.add(new CarrePanel(new Carre()));
        }
    
        this.getContentPane().add(paneprinci);
    }
    
    

    public static void main (String[]args) {
        javax.swing.SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() { 
                        Etabli e=new Etabli();
                    }
                });
    }
    
    public class CarrePanel extends JPanel implements MouseInputListener{
        
        private Carre carre;
        private boolean etat;
        private int xprev;
        private int yprev;

        
        public CarrePanel(Carre c) {
            setBounds(new Random().nextInt(500),new Random().nextInt(500), 50, 50);
            addMouseListener(this);
            addMouseMotionListener(this);
            this.setBackground(c.getColor());
            this.carre=c;
        }
        
        public CarrePanel() {
            setBounds(new Random().nextInt(500),new Random().nextInt(500), 50, 50);
            addMouseListener(this);
            addMouseMotionListener(this);
        }
        
        public void setCarre(Carre c) {
            carre=c;
        }
        
        public Carre getCarre() {
            return carre;
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            
            
            System.out.println(this.carre.getColor());
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            if (selected.getCarre()!=null) {
                this.carre.setColor(selected.getCarre().getColor());
                this.setBackground(selected.getCarre().getColor());
            }
        }
        
        @Override
        public void mousePressed(MouseEvent e) {
            etat=true;
            selected.setCarre(this.carre);
            xprev=e.getXOnScreen();
            yprev=e.getYOnScreen();
    
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            etat=false;
            if(selected.getCarre()==this.carre) {
                
                selected.setCarre(null);;
            }
            
        }


        @Override
        public void mouseExited(MouseEvent e) {

        }

        @Override
        public void mouseDragged(MouseEvent e) {
            
            if(etat) {
                int x=this.getX()+e.getXOnScreen()-xprev;
                int y=this.getY()+e.getYOnScreen()-yprev;
                this.setLocation(x,y);
                xprev=e.getXOnScreen();
                yprev=e.getYOnScreen();
                
            }
        }

        @Override
        public void mouseMoved(MouseEvent e) {
            
        }
        
    }

}

这是 Carre 的代码(法语为正方形)

import java.awt.Color;
import java.util.Arrays;
import java.util.Random;
import java.awt.Color;



public class Carre {

        
        private Color color;
        public Carre() {
            color=new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255));
        }
        
        public Color getColor() {
            return color;
        }
        
        public void setColor(Color c) {
            color=c;
        }
    }

我不明白为什么它有时会起作用,我不知道问题是来自我如何进行拖动事件还是其他地方有问题。

谢谢你的遮阳篷。

标签: javaswingmouseeventmouselistener

解决方案


我不明白为什么它有时会起作用,

当您将一个正方形拖动到另一个正方形时,您会注意到有时拖动的正方形会被绘制:

  1. 在另一个广场下方
  2. 在另一个广场之上

当正方形被绘制above到另一个正方形时mouseEntered,不会生成事件,因为默认逻辑只会为顶部组件生成事件。

当正方形被绘制below到另一个正方形时,就会mouseEntered生成您的事件并且您的逻辑按预期工作。

组件的绘制顺序由其 ZOrder 决定。因此,您可以将拖动组件的 ZOrder 调整为最后绘制的组件。

mousePressed逻辑中,您可以添加:

JPanel parent = (JPanel)getParent();
parent.setComponentZOrder(this, parent.getComponentCount() - 1);

这将确保拖动的组件始终被绘制below到其他组件。

另请注意,etat不需要您的变量。mouseDragged 事件仅在鼠标按下时生成。


推荐阅读