为什么在添加JFrame时更改了数组对象?

时间:2017-06-24 04:10:58

标签: java arrays

我正在将一个对象数组添加到JFrame上。当我在JFrame中更改对象的状态时,它不会在数组中更改。对象的类称为 connect2 。我所做的更改是将connect2的arrayPosition字段增加1.对添加到JFrame的对象进行更改,但不对相应的数组进行更改。

算法如下:

connect1 扩展了JFrame并包含调用 connect1 构造函数的main方法。 connect1构造函数设置JFrame的大小,将JFrame设置为visible,设置GridLayout,并实例化100个也是JPanels的connect2对象并将它们添加到数组中。 100个connect2 JPanel通过for循环添加到JFrame。

connect2 构造函数接受connect1参数。单击 connect2 时,将增加connect1的静态计数器字段。计数器的值传递给connect2的arrayposition变量。

出于某种原因,当我在 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);
}


}

1 个答案:

答案 0 :(得分:0)

看看refr = refresh;声明。该语句位于arrayPosition = refr.counter下面。