gpt4 book ai didi

java - 由于鼠标事件无效,如何将第一个 JLabel 背景颜色分配给下一个 JLabel?

转载 作者:行者123 更新时间:2023-12-02 05:36:57 29 4
gpt4 key购买 nike

现在,我正在开发另一个 JPanel与 9 JLabel每个分配有不同的 Color 。应用程序要做的是,当用户单击第一个面板时,除了 JLabel 的颜色发生变化之外,不会发生任何事情。将被注册到实例变量,并且当他/她单击第二个 JLabel 时,第二个的颜色必须更改为之前第一个的颜色。假设单击第三个颜色时会继续此操作,注册颜色并将第四个颜色更改为第三个颜色。

所以我的问题是从MouseListener开始的events 都是 void 方法,我该如何实现这个结果?有没有办法绕过 void 方法?提前致谢!

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;

class TilePanelB extends JPanel implements MouseListener
{
JLabel label1;
JLabel label2;
JLabel label3;
JLabel label4;
JLabel label5;
JLabel label6;
JLabel label7;
JLabel label8;
JLabel label9;

JLabel theLabel;
JLabel theLabelB;

Color temp;
Color tempB;

public TilePanelB()
{
this.setLayout(new GridLayout(3, 3));
Dimension labelSize = new Dimension(300, 300);

label1 = new JLabel();
label2 = new JLabel();
label3 = new JLabel();
label4 = new JLabel();
label5 = new JLabel();
label6 = new JLabel();
label7 = new JLabel();
label8 = new JLabel();
label9 = new JLabel();

label1.setPreferredSize(labelSize);
label2.setPreferredSize(labelSize);
label3.setPreferredSize(labelSize);
label4.setPreferredSize(labelSize);
label5.setPreferredSize(labelSize);
label6.setPreferredSize(labelSize);
label7.setPreferredSize(labelSize);
label8.setPreferredSize(labelSize);
label9.setPreferredSize(labelSize);

label1.setBackground(Color.WHITE);
label2.setBackground(Color.BLACK);
label3.setBackground(Color.RED);
label4.setBackground(Color.GREEN);
label5.setBackground(Color.YELLOW);
label6.setBackground(Color.BLUE);
label7.setBackground(Color.GRAY);
label8.setBackground(Color.PINK);
label9.setBackground(Color.CYAN);

label1.setOpaque(true);
label2.setOpaque(true);
label3.setOpaque(true);
label4.setOpaque(true);
label5.setOpaque(true);
label6.setOpaque(true);
label7.setOpaque(true);
label8.setOpaque(true);
label9.setOpaque(true);

this.add(label1);
this.add(label2);
this.add(label3);
this.add(label4);
this.add(label5);
this.add(label6);
this.add(label7);
this.add(label8);
this.add(label9);

label1.addMouseListener(this);
label2.addMouseListener(this);
label3.addMouseListener(this);
label4.addMouseListener(this);
label5.addMouseListener(this);
label6.addMouseListener(this);
label7.addMouseListener(this);
label8.addMouseListener(this);
label9.addMouseListener(this);
} // end of constructor

public void mousePressed(MouseEvent e)
{
}

public void mouseReleased(MouseEvent e)
{
}

public void mouseEntered(MouseEvent e)
{
}

public void mouseExited(MouseEvent e)
{
}

public void mouseClicked(MouseEvent e)
{
theLabel = (JLabel)e.getSource(); //First click from the user
temp = theLabel.getBackground(); //Stores the background color of JLabel

theLabelB = (JLabel)e.getSource(); //Second click from the user

if(!theLabelB.getBackground().equals(theLabel.getBackground()))
{
tempB = theLabel.setBackground(temp); //Assigns background color of next JLabel to temp variable
}
}
// end of constructor

} // end of class

最佳答案

void 与此无关。您只需按每一次按钮即可更改类(class)状态。为您的类变量提供按下的 JLabel 的颜色,然后从鼠标监听器中更改这些变量的状态。

即,

private Color lastColorPressed = null;

// in mousePressed:
@Override
public void mousePressed(MouseEvent e) {
JLabel label = (JLabel) e.getSource();
Color thisColor = label.getBackground();
if (lastColorPressed != null) {
label.setBackground(lastColorPressed);
}
lastColorPressed = thisColor;
}

旁注 1:我通常会避免重写 mousePressed 方法,而改用 mouseClicked 方法,因为如果您在单击和释放之间移动鼠标,mouseClicked 仍然可以工作。

附注 2:关于您的代码:

public void mouseClicked(MouseEvent e)
{
theLabel = (JLabel)e.getSource(); //First click from the user
temp = theLabel.getBackground(); //Stores the background color of JLabel

theLabelB = (JLabel)e.getSource(); //Second click from the user
//....

theLabelB 如何表示第二次点击,而 theLabel 表示第一次点击?这对我来说没有意义,因为源不可能在两次调用 e.getSource() 之间的不到毫秒的时间内发生变化。请理解,两个变量必须引用同一个对象。

关于java - 由于鼠标事件无效,如何将第一个 JLabel 背景颜色分配给下一个 JLabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875697/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com