再次设置JPanel对象的背景

时间:2015-11-06 22:05:38

标签: java swing jpanel

为了帮助您了解有关Java EventListeners的更多信息,我创建了一个简单的程序,其中包含一个JFrame和两个JPanels,它应该做的就是切换一个辅助颜色在Jpanel上点击它。

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

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) {}
    }
}

2 个答案:

答案 0 :(得分:3)

首先,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;
    }
}

答案 1 :(得分:2)

除了@ 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;
    }
}