第二次设置JPanel对象的背景

Set background of JPanel object a second time

为了帮助更多地了解 Java 中的 EventListeners,我创建了一个简单的程序,其中包含一个 JFrame 和两个 JPanels 以及所有它应该要做的是在点击 Jpanel 时切换辅助颜色。

我的代码在每个 JPanel 被单击时将其更改为新的辅助颜色,但当它被第二次单击时它会恢复为原始颜色。我需要更改什么才能使其正常工作?我已经尝试多次重写代码,所以我一定是遗漏了一些关于 EventListeners 或 JPanels 如何工作的概念。

package com.spencerlarry;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class View extends JFrame{

    public static final int OFF = 1;
    public static final int ON = 1;

    public static final String DARKGRAY = "#696969";
    public static final String CYAN = "#00FFFF";

    Space top;
    Space bottom;

    public View(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Window Test");
        this.setSize(300, 300);
        this.setMinimumSize(getSize());

        this.setLayout(new GridLayout(2,1));
        add(new Space());
        add(new Space());

    }

    public class Space extends JPanel implements MouseListener{

        private String color;

        public Space(){
            setBackground(Color.decode(DARKGRAY));
            addMouseListener(this);
        }

        public String getColor(String c){
            return color;
        }

        public void setColor(){
            if(color == CYAN){
                setBackground(Color.decode(DARKGRAY));
            }
            else{
                setBackground(Color.decode(CYAN));
            }

        }

        @Override
        public void mouseClicked(MouseEvent e) {
            this.setColor();
        }

        @Override
        public void mousePressed(MouseEvent e) {}
        @Override
        public void mouseReleased(MouseEvent e) {}
        @Override
        public void mouseEntered(MouseEvent e) {}
        @Override
        public void mouseExited(MouseEvent e) {}
    }
}

首先,don't compare Strings with ==。你的 if 语句应该是:

if(color.equals(CYAN))

但这将在第一次抛出空指针异常,因为您没有初始化 color 的值。

您实际上并没有设置或更改 color 变量的值,因此当您检查

if(color == CYAN)

它总是求值为 false,这意味着您总是在调用

setBackground(Color.decode(CYAN));

当你点击时,无论如何。

在你的 Space 构造函数中,你应该将 color 初始化为 DARKGRAY (以避免空指针异常),然后将 setColour() 更改为如下所示:

public void setColor(){
    if(color.equals(CYAN)){
        setBackground(Color.decode(DARKGRAY));
        color = DARKGRAY;
    }
    else{
        setBackground(Color.decode(CYAN));
        color = CYAN;
    }
}

除了@gla3dr给出的答案,为什么每次都解码颜色字符串?只需定义:

public static final Color MY_DARKGRAY = new Color("#696969");
// there is already a standard Color.CYAN, so don't re-define it

然后在构造函数中设置颜色,

public void setColor(){
    if( color == Color.CYAN )){
        setBackground( MY_DARKGRAY );
        color = MY_DARKGRAY;
    }
    else{
        setBackground(Color.CYAN);
        color = Color.CYAN;
    }
}