2017-06-24 25 views
0

私はJFrameにオブジェクトの配列を追加しています。 JFrameでオブジェクトの状態を変更すると、配列内で変化していません。オブジェクトのクラスはconnect2と呼ばれます。私が行っている変更はconnect2のarrayPositionフィールドを1増やしています。変更はJFrameに追加されたオブジェクトで行われますが、対応する配列では行われません。次のように追加されたJFrameで配列オブジェクトが変更されたときに配列オブジェクトが変更されないのはなぜですか?

アルゴリズムである:

CONNECT1はJFrameのを拡張し、CONNECT1コンストラクタを呼び出すmainメソッドを含んでいます。 connect1コンストラクタはJFrameのサイズを設定し、JFrameを可視に設定し、GridLayoutを設定し、JPanelでもある100のconnect2オブジェクトをインスタンス化して配列に追加します。 100のconnect2 JPanelがforループを介してJFrameに追加されます。

connect2コンストラクタはconnect1引数をとります。 connect2をクリックすると、connect1の静的カウンタフィールドが増加します。カウンタの値は、connect2のarrayposition変数に渡されます。

何かの理由で、配列のconnect2オブジェクトにconnect1でアクセスすると、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クラス:REFR =リフレッシュで

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

バンドール、私は自分の入力を詳細に質問を修正するつもりです。 – Tito

答えて

0

ルック。ステートメント。このステートメントは、arrayPosition = refr.counterの下にあります。

関連する問題