Java Object值不一致

时间:2014-09-07 11:29:25

标签: java object

我找不到任何其他问题的解决方案,因为我不确定如何用足够的语言来描述它。

当我在activeList类中分配currentActiveList ActiveList一个随机生成的矩形字段时,它接收到的值就好了。

public class ActiveList {
    Rectangle[] activeList = new Rectangle[10];

    public ActiveList() {
        for(int i = 0; i < activeList.length; i++)
            activeList[i] = null;
    }

    public void addToList(Rectangle x) {
        for(int i = 0; i < this.activeList.length; i++) {
            if(this.activeList[i] == null) {
                this.activeList[i] = x;
                i = this.activeList.length+1;
            }

            else
                this.activeList[activeList.length-1] = x;
        }
    }

    public Rectangle[] getActiveList() {
        return this.activeList;
    }

    public int getLength() {
        //System.out.print(this.activeList.length);
        return this.activeList.length;
    }

    public void deleteFromList(int x) {
        this.activeList[x] = null;
    }

    public Rectangle getFromList(int x) {
        Rectangle retVal = this.activeList[x];
        //System.out.println("Returning getFromList(int x): " +retVal);
        return retVal;
    }

    public void genRandomRectangle() {
        Random randomNumberGenerator = new Random();
        double[] pointVal = new double[4];
        double randomInt = randomNumberGenerator.nextInt(400-10);
        pointVal[0] = randomInt;
        randomInt = randomNumberGenerator.nextInt(400-10);
        pointVal[1] = randomInt;
        randomInt = randomNumberGenerator.nextInt((int) (400-pointVal[0]));
        if(randomInt < 5) {
            randomInt = randomInt+pointVal[0]+5;
        }

        else
            pointVal[2] = randomInt+pointVal[0];

        randomInt = randomNumberGenerator.nextInt((int) (400-pointVal[1]));
        if(randomInt < 5) {
            randomInt = randomInt+pointVal[1]+5;
        }

        else
            pointVal[3] = randomInt+pointVal[1];

        Rectangle newRandom = new Rectangle(pointVal[0], pointVal[1], pointVal[2], pointVal[3]);
        //System.out.println(pointVal[0]);
        //System.out.println(pointVal[1]);
        //System.out.println(pointVal[2]);
        //System.out.println(pointVal[3]);
        System.out.println("New Random: " +newRandom);

        addToList(newRandom);
    }
}

但是,当我尝试在主类GraphicGen中使用这些值时,currentActiveList会为其所有索引返回空值。

public class GraphicGen extends JPanel {
    ActiveList currentActiveList = new ActiveList();
    public static int gridSpaceX = 400;
    public static int gridSpaceY = 400;
    static JFrame mainFrame = new JFrame();

    protected void paintComponent(Graphics g) {
        //super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //int w = getWidth();
        //int h = getHeight();
        // Draw ordinate.
        //g2.draw(new Line2D.Double(PAD, PAD, PAD, h-PAD));
        // Draw abcissa.
        //g2.draw(new Line2D.Double(PAD, h-PAD, w-PAD, h-PAD));
        //double xInc = (double)(w - 2*PAD)/(data.length-1);
        //double scale = (double)(h - 2*PAD)/maxValue();
        // Mark data points.
        //g2.setPaint(Color.red);

        double[] coords = new double[4];
        //g2.fill(new Ellipse2D.Double(coords[0], coords[1], 4, 4));
        //g2.fill(new Ellipse2D.Double(coords[2], coords[3], 4, 4));
        //g2.fill(new Ellipse2D.Double(100, 100, 4, 4));
        System.out.println("Graphic Gen Active List Obj: " +currentActiveList);
        System.out.println("Ya drew a new Main GUI!");
        System.out.println("currentActiveList.getActiveList(): " +currentActiveList.getActiveList());
        for(int i = 0; i < currentActiveList.getLength(); i++) {
            //System.out.println("currentActiveList.getFromList(i): "+currentActiveList.getFromList(i));
            //System.out.println("Graphic Gen Active List Obj: " +currentActiveList);
            //System.out.println(activeList.getFromList(i).getTopLeftX());
            if(currentActiveList.getFromList(i) != null) {
                coords[0] = currentActiveList.getFromList(i).getTopLeftX();
                System.out.println(coords[0]);
                coords[1] = currentActiveList.getFromList(i).getTopLeftY();
                System.out.println(coords[1]);
                coords[2] = currentActiveList.getFromList(i).getBottomRightX();
                System.out.println(coords[2]);
                coords[3] = currentActiveList.getFromList(i).getBottomRightY();
                System.out.println(coords[3]);
                g2.draw(new Line2D.Double(coords[0], coords[1], coords[2], coords[1]));
                g2.draw(new Line2D.Double(coords[0], coords[1], coords[0], coords[3]));
                g2.draw(new Line2D.Double(coords[2], coords[1], coords[2], coords[3]));
                g2.draw(new Line2D.Double(coords[0], coords[3], coords[2], coords[3]));
            }
        }

        /*double x = 50;
        double y = 50;
        g2.fill(new Ellipse2D.Double(x, y, 4, 4));*/
        /*for(int i = 0; i < data.length; i++) {
            double x = PAD + i*xInc;
            double y = h - PAD - scale*data[i];
            g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
        }*/
    }

    /*private int maxValue() {
        int max = data[0];
        for(int i = 0; i < data.length; i++) {
            if(data[i] > max)
                max = data[i];
        }
        return max;
    }*/

    public void callRepaintOnMain() {
        mainFrame.repaint();
    }

    public void callGenRandom() {
        currentActiveList.genRandomRectangle();
    }

    public static void main(String[] args) {
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.add(new GraphicGen());
        mainFrame.setSize(gridSpaceX, gridSpaceY);
        ButtonPrompt buttonPrompter = new ButtonPrompt();
        mainFrame.setLocation(200,200);
        mainFrame.setVisible(true);
    }
}

随机生成器方法由动作侦听器调用。

public class ButtonPrompt extends GraphicGen {

    ActionListener actionListenerRandom = new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
          //currentActiveList.genRandomRectangle();
            callGenRandom();
            callRepaintOnMain();
        }
    };

    JButton randomBtn = new JButton("Add Random Rectangle");        
    JButton inputCoordinates = new JButton("Input Rectangle Coordinates");

    public ButtonPrompt() {
        JFrame f = new JFrame("Add Rectangles");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BoxLayout boxLayout = new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS);
        f.setLayout(boxLayout);

        randomBtn.addActionListener(actionListenerRandom);

        f.setSize(200, 200);
        f.setLocation(600, 200);
        f.setVisible(true);
        f.add(randomBtn);
        f.add(inputCoordinates);
        f.pack();
    }
}

这是一个范围或引用问题吗?我真的很茫然。

2 个答案:

答案 0 :(得分:1)

你的实际问题还不清楚,但只是阅读前两种方法足以找到我认为是错误的内容:

public ActiveList() {
    for(int i = 0; i < activeList.length; i++)
        activeList[i] = null;
}

上面的代码完全没用。对象数组的元素的默认值为null。因此循环将null赋给已经为null的变量。

public void addToList(Rectangle x) {
    for(int i = 0; i < this.activeList.length; i++) {
        if(this.activeList[i] == null) {
            this.activeList[i] = x;
            i = this.activeList.length+1;
        }

        else
            this.activeList[activeList.length-1] = x;
    }
}

如果列表只包含null,则矩形将存储在索引0处,循环将停止。对于对此方法的所有后续调用,循环将发现索引0处的元素不为null,因此将x存储在数组的最后一个索引处,然后存储在第一个非空索引处。

我不确切地知道你想要实现的目标,以及实际问题是什么,但你应该忘记基于数组实现自己的列表,而是使用ArrayList。 / p>

答案 1 :(得分:1)

下面:

public static void main(String[] args) {
    ...
    mainFrame.add(new GraphicGen());
    ...
    ButtonPrompt buttonPrompter = new ButtonPrompt();
}

ButtonPrompt 延伸 GraphicGen,这是一个JPanel。在ButtonPrompt的构造函数中,您创建了JFrame并向其添加了两个JButton

因此,当您的应用启动时,屏幕上会有两个JFrame,一个是mainFrame,其中包含GraphicGen,另一个是buttonPrompter,其中包含两个按钮。

当您点击该按钮时,系统会调用actionPerformed(),如果随机生成逻辑为,则实际调用callGenRandom()的<{1}} - 更正,生成的矩形被添加到buttonPrompter。但是你没有将这个buttonPrompter添加到buttonPrompter中的任何一个,你就不会看到它。


你可能想要什么:

JFrame不会延伸ButtonPrompt,而是为GraphicGen提供您添加到ButtonPrompt的{​​{1}}的引用。

GraphicGen

和您的mainFrame

public class ButtonPrompt extends GraphicGen {
    JButton randomBtn = new JButton("Add Random Rectangle");        
    JButton inputCoordinates = new JButton("Input Rectangle Coordinates");
    final GraphicGen gg;

    public ButtonPrompt(GraphicGen gg) {
        this.gg = gg;
        ......

        ActionListener actionListenerRandom = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                gg.callGenRandom();
                gg.callRepaintOnMain();
            }
        };

        randomBtn.addActionListener(actionListenerRandom);

        ......
    }
}

此外,代码还存在其他问题。

例如,main()是一个public static void main(String[] args) { ... GraphicGen gg = new GraphicGen(); mainFrame.add(gg); ... ButtonPrompt buttonPrompter = new ButtonPrompt(gg); } 主类,它有一个GraphicGen字段,实际上包含应用运行时的JPanel实例 - 这看起来坏。我不太了解Swing ......是否必须拨打包含JFrame GraphicGen的内容,而不是仅仅拨打JFrame&#39; s repaint(),如果有的话?