2015-11-06 54 views
1

为了帮助了解关于Java中的EventListeners的更多信息,我创建了一个简单的程序,它由一个JFrame和两个JPanels组成,它应该做的是在Jpanel上切换第二色作为它被点击。第二次设置JPanel对象的背景

我的代码在点击时将每个JPanel更改为新的辅助颜色,但当它再次单击时,它会恢复为原始颜色。我需要改变以使其正常工作?我试过多次重写代码,所以我必须忽略EventListener或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) {} 
    } 
} 

回答

3

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

if(color.equals(CYAN)) 

但是这会抛出一个空指针异常的第一次,因为你没有初始化的color值。

你实际上并没有设置或更改color变量的值,所以当你检查

if(color == CYAN) 

它总是计算为false,这意味着你总是叫

setBackground(Color.decode(CYAN)); 

当你点击,不管是什么。

在你Space构造函数,你应该初始化colorDARKGRAY(避免空指针异常),然后更改setColour()到这样的事情:

public void setColor(){ 
    if(color.equals(CYAN)){ 
     setBackground(Color.decode(DARKGRAY)); 
     color = DARKGRAY; 
    } 
    else{ 
     setBackground(Color.decode(CYAN)); 
     color = CYAN; 
    } 
} 
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; 
    } 
} 
+0

@spencerlarry注意,'color'变量将不得不从'String'改为'Color'如果你做这个。 – gla3dr