2015-11-06 43 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