java - 当我通过另一个面板时如何更改面板的颜色?
问题描述
我正在创建一个代码,我需要将面板颜色更改为当我通过它时仍然按下的颜色。例如,假设我按下一个绿色面板并将其拖到另一个面板上,这个面板应该是绿色的。但是,它并非每次都有效,例如有时它确实会改变颜色,但有时却不会。
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;
}
}
我不明白为什么它有时会起作用,我不知道问题是来自我如何进行拖动事件还是其他地方有问题。
谢谢你的遮阳篷。
解决方案
我不明白为什么它有时会起作用,
当您将一个正方形拖动到另一个正方形时,您会注意到有时拖动的正方形会被绘制:
- 在另一个广场下方
- 在另一个广场之上
当正方形被绘制above
到另一个正方形时mouseEntered
,不会生成事件,因为默认逻辑只会为顶部组件生成事件。
当正方形被绘制below
到另一个正方形时,就会mouseEntered
生成您的事件并且您的逻辑按预期工作。
组件的绘制顺序由其 ZOrder 决定。因此,您可以将拖动组件的 ZOrder 调整为最后绘制的组件。
在mousePressed
逻辑中,您可以添加:
JPanel parent = (JPanel)getParent();
parent.setComponentZOrder(this, parent.getComponentCount() - 1);
这将确保拖动的组件始终被绘制below
到其他组件。
另请注意,etat
不需要您的变量。mouseDragged 事件仅在鼠标按下时生成。
推荐阅读
- java - 发布到 Maven 中心时缺少 jar 的签名 jar.asc
- c# - 单元测试未涵盖 LINQ `Any`
- javascript - 使用多个骰子时计算给定骰子掷骰的机会
- c# - 无法将“System.Single”类型的对象转换为“System.Double”类型。
- c++ - 哪些编译器支持在运行时固定大小的数组,哪些编译器不支持?
- python - 在 Pandas DataFrame 重新索引上丢失数据
- regex - 如何规范地解析模块名称
- azure-active-directory - Azure AD 如何将用户扩展属性传递给多租户应用程序
- dart - Dart 指定列表仅包含从另一个类扩展的对象
- bigcommerce - 我们如何将大商业与非常好的安全性 (VGS) 相结合