当前位置: 首页 > 知识库问答 >
问题:

当我用另一个面板通过它时,如何改变面板的颜色?

古棋
2023-03-14

我正在创建一个代码,在那里我需要改变面板的颜色,当我通过它时,我仍然按在上面。例如,假设我按下一个绿色面板,然后拖动它到另一个面板上,这个面板应该是绿色的。然而,它并不是每次都起作用,就像有时它会改变颜色,但有时它不会。

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

我不明白的是为什么它有时会起作用,我不知道问题是否来自我如何做我的拖拽事件,或者是其他地方出了问题。

谢谢你的雨篷。

共有1个答案

丁理
2023-03-14

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

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

  1. 另一方块下方
  2. 在另一方块上方

当方块画为上面另一个方块时,不会生成mouseEntered事件,因为默认逻辑将只为顶部组件生成事件。

当方块画在另一个方块的下方时,您的mouseEntert事件就会生成,您的逻辑就会按照预期工作。

组件的涂装顺序由其Zorder决定。因此您可以调整拖动组件的ZOrder为最后绘制的组件。这将确保拖动的组件总是画在其他组件的下方

在mousePressed逻辑中,可以添加

JPanel parent = (JPanel)getParent();
parent.setComponentZOrder(this, parent.getComponentCount() - 1);
 类似资料:
  • 在我的程序中,我有一个基于向导的布局。由CardLayout实现。因此,有一组类扩展了JPanel。我想在每个面板上都有按钮来导航到其他面板。例如,当程序显示第一面板时,我想有一个按钮来显示第二面板。 我试图在main cardlayout panel holder中创建一个方法,以便任何其他类都可以通过该方法更改显示面板,但它不起作用,并且出现了stackoverflow错误。 这是我的课程 基

  • 问题内容: 我用Google搜索了很多东西,但没有找到解决方案。我认为应该有Java大师来帮助我… 这是我的初始化方法: 这是JPanel另一个步骤0的方法: 完全没有任何回应,我尝试过重新验证,重新粉刷和其他工作人员…不起作用…任何人在这里都可以得到意见! 问题答案: 这就是将正确的方法和常量String暴露给外界,以允许类交换视图本身。例如,给您的第一堂课一个私有的CardLayout字段,称

  • 问题内容: 我创建了一个框架,然后在其中创建了面板。我已经将图像放置在一个 面板中,现在我需要将该图像拖动到另一个面板中。我该怎么做。 请作为初学者逐步说明。 问题答案: 使用纯Java的快速示例DragGestureListener,DropTargetAdapter并 TransferHandler为一个面板上的图像对另一面板的DnD支持: 选择绿色形状并将其拖动到上方的空白面板后:

  • 问题内容: 我有一个非常基本的模板(basic_template.html),并希望使用使用另一部分模板格式化的数据来填写。basic_template.html可能包含使用部分模板格式化的几件事。 我应该如何在views.py中构建代码? 我这样做的原因是稍后将使用Ajax填充。我这样做对吗? 问题答案: 你可以做: 另一个Django模板在哪里。在这里,你可以放入将用Ajax获得的HTML。

  • 一、简介 “我的面板"用于显示和管理用户个人信息,是当你登陆系统时默认显示的页面。 二、功能演示 修改个人信息 修改密码

  • 问题内容: 我有一个程序,其中有一个按钮可以将背景色更改为红色,而另一个按钮可以将背景色设置为默认。 如何获取面板的默认颜色? 问题答案: 将默认颜色存储到构造函数中的变量中,或在使用其他按钮更改颜色之前将其存储,即: 并在您的默认颜色按钮中: