2015-06-13 33 views
1

我有這樣一段代碼中的方法:縮短一段代碼會產生錯誤;我該如何解決這個問題?

switches[0].addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e) 
     { 
      if(switchstate[0] == false) 
      { 
       if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN)) 
        switchstate[0] = true; 
      }else 
      { 
       if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN)) 
        switchstate[0] = false; 
      } 

      paintStuff(); 
     } 
    }); 

switches[1].addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e) 
     { 
      if(switchstate[1] == false) 
      { 
       if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN)) 
        switchstate[1] = true; 
      }else 
      { 
       if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN)) 
        switchstate[1] = false; 
      } 

      paintStuff(); 
     } 
    }); 

switches[2].addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e) 
     { 
      if(switchstate[2] == false) 
      { 
       if((e.getX() >= OFFBUTTONLEFT && e.getX() <= OFFBUTTONRIGHT) && (e.getY() >= OFFBUTTONTOP && e.getY() <= OFFBUTTONDOWN)) 
        switchstate[2] = true; 
      }else 
      { 
       if((e.getX() >= ONBUTTONLEFT && e.getX() <= ONBUTTONRIGHT) && (e.getY() >= ONBUTTONTOP && e.getY() <= ONBUTTONDOWN)) 
        switchstate[2] = false; 
      } 

      paintStuff(); 
     } 
    }); 

其中變量(類的字段)是

JLabel[] switches = new JLabel[3];  //I've initialized each index 
boolean[] switchstate = new boolean[3]; //Indices Initialized to 'false' 

final static int OFFBUTTONTOP = 75; 
final static int OFFBUTTONLEFT = 30; 
final static int OFFBUTTONRIGHT = 65; 
final static int OFFBUTTONDOWN = 115; 

final static int ONBUTTONTOP = 35; 
final static int ONBUTTONLEFT = 25; 
final static int ONBUTTONRIGHT = 60; 
final static int ONBUTTONDOWN = 75; 

欲縮短那塊的代碼,所以我做了

for(final int i=0; i<switchstate.length; i++) 
    switches[i].addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e) 
     { 
      if(switchstate[i]) 
      { 
       if(ON_RECTANGLE.contains(e.getX(), e.getY())) 
        switchstate[i] = false; 
      } 
      else 
      { 
       if(OFF_RECTANGLE.contains(e.getX(), e.getY())) 
        switchstate[i] = true; 
      } 
     } 
    }); 

與兩個新的變量是

final static Rectangle OFF_RECTANGLE = new Rectangle(30, 75, 35, 40); 
final static Rectangle ON_RECTANGLE = new Rectangle(25, 35, 35, 30); 

但是縮短的代碼給我一個錯誤:

error: local variable i is accessed from within inner class; needs to be declared final 

但如果我宣佈ifinal,我不能用i++,因爲它給

error: cannot assign a value to final variable i 

如何避免此問題?

回答

2

使用另一個變量 -

for(int i = 0; i < switchstate.length; i++) { 
    final int j = i; 
    switches[i].addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e) 
     { 
      if(switchstate[j]) 
      { 
       if(ON_RECTANGLE.contains(e.getX(), e.getY())) 
        switchstate[j] = false; 
      } 
      else 
      { 
       if(OFF_RECTANGLE.contains(e.getX(), e.getY())) 
        switchstate[j] = true; 
      } 

      paintStuff(); 
     } 
    }); 
} 

這樣你可以捕獲i您的mouseClicked方法裏面的價值,而不是捕捉變量本身(不幸的是Java不允許尚未)。