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

标签 java swing colors mouseevent jlabel

现在,我正在开发另一个 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/

相关文章:

Java 正则表达式,IllegalStateException : No match found

java - NetBeans 配置文件菜单丢失

python - 我在尝试绘制 Mandelbrot 集时数学有什么问题?

c# - UWP - 在不更改最小化/关闭按钮颜色的情况下更改后退按钮颜色

javascript - 排序颜色/颜色值

java - 通过java processBuilder运行cmd命令

java - Grails 2.4.4 spring安全角色不适用于用户

java - JFileChooser 的 FileFilter 不过滤文件 - 不知道为什么,有代码

java - 将 JButton 放置在特定坐标上 [需要帮助]

Java - JInternalFrame - 无法从 JFrame 关闭 JInternalFrame‏