为了帮助您了解有关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) {}
}
}
答案 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;
}
}