2017-06-24 30 views
0

我正在將一個對象數組添加到JFrame上。當我在JFrame中更改對象的狀態時,它在數組中不會更改。該對象的類名爲connect2。我所做的更改是將connect2的arrayPosition字段增加1.更改是添加到JFrame的對象而不是相應的數組。爲什麼數組對象在添加到JFrame中時發生更改?

的算法如下:

CONNECT1延伸的JFrame和包含調用CONNECT1構造的主要方法。 connect1構造函數設置JFrame的大小,將JFrame設置爲可見,設置GridLayout,並實例化100個也是JPanel的connect2對象,並將它們添加到數組中。 100個connect2 JPanel通過for循環添加到JFrame中。

connect2構造函數需要connect1參數。當點擊connect2時,它會增加connect1的靜態計數器字段。計數器的值傳遞給connect2的數組變量。

由於某些原因,當我訪問connect1中的數組中的connect2對象時,arrayposition變量沒有改變。

有人能幫我解決這個問題嗎?爲什麼數組中的對象不會改變。 Java數組存儲對象的內存位置,不是嗎?

這裏是我的代碼:

package connect; 

import java.awt.*; 
import javax.swing.JFrame; 

public class connect1 extends JFrame 
{ 
static int counter = 0;  
int M = 10; 
int N = 10; 
int Grid = M*N; 
connect2 array[] = new connect2 [Grid]; 

private static final long serialVersionUID = 1L; 

public static void main(String[] args) 
{ 
    new connect1(); 
} 

public connect1() 
{ 
    setVisible(true); 
    setSize(1000, 1000); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new GridLayout(M, N)); 
    //add(new Welcome(this)); 
    //int Grid = M*N; 
    //connect2 array[] = new connect2 [Grid]; 
    for (int j = 0; j < Grid; j++) 
    { 
     array[j] = new connect2(this); 
     add(array[j]); 
    } 
} 

public void toRefresh() 
{ 
    if (counter > 0) 
    { 
     bubbleSort(array); 
    } 

    repaint(); 
} 

public void bubbleSort(connect2[] x) 
{ 
    connect2 temp; 
    for (int i = 0; i < /*x.length*/ counter - 1; i++) 
    { 
     for (int j = 1; j < /*x.length*/ counter - i; j++) 
     { 
      //System.out.println(x[j - 1].arrayPosition+" j - 1 "+x[j].arrayPosition+" j "); 
      if (x[j - 1].arrayPosition > x[j].arrayPosition) 
      { 
       temp = x[j - 1]; 
       x[j - 1] = x[j]; 
       x[j] = temp; 
      } 

     } 
    } 
} 

public void undo() 
{ 
    for (int i = 0; i < array.length; i++) 
    { 
     System.out.println(array[i].arrayPosition); 
    } 
} 

} 

CONNECT2類:

package connect; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JPanel; 


public class connect2 extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 

int arrayPosition; 
int whenClicked = 0; 
connect1 refr = null; 


public connect2(connect1 refresh) 
{ 
    addMouseListener(new MouseListener() 
    { 

     @SuppressWarnings("static-access") 
     @Override 
     public void mouseClicked(MouseEvent arg0) 
     { 
      if(arg0.getModifiers() == MouseEvent.BUTTON1_MASK) 
      { 
       whenClicked++; 
       refr.counter++; 
       arrayPosition = refr.counter; 
       refr.toRefresh(); 
      } 

      if(arg0.getModifiers() == MouseEvent.BUTTON3_MASK) 
      { 
       System.out.println(arrayPosition); 
       refr.undo();     
      } 
     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) 
     { 
      // Not used 
     } 

     @Override 
     public void mouseExited(MouseEvent arg0) 
     { 
      // Not used  
     } 

     @Override 
     public void mousePressed(MouseEvent arg0) 
     { 
      // Not used  
     } 

     @Override 
     public void mouseReleased(MouseEvent arg0) 
     { 
      // Not used  
     } 

    }); 

    refr = refresh; 
} 

@Override 
protected void paintComponent(Graphics g) 
{ 
    switch(whenClicked) 
    { 
     case 1: 
     g.setColor(Color.red); 
     break; 

     case 2: 
     g.setColor(Color.blue); 
     break; 
    } 
     g.fillOval(0, 0, 80, 80); 
} 


} 
+0

同一個對象同時在框架和數組中,因此它被更新。你給了什麼投入,你期望什麼產出? – vandale

+0

vandale,我要修改我的問題以詳細說明我的意見。 – Tito

回答

0

看那REFR =刷新;聲明。該語句位於arrayPosition = refr.counter下方。

相關問題