简体   繁体   English

Java对象值不一致

[英]Java Object values not consistent

I couldn't find any other solutions to my problem because I'm unsure of how to describe it in few enough words. 我找不到其他解决方案,因为我不确定如何用足够多的词来描述它。

When I assign activeList , which is a field of currentActiveList a randomly generated Rectangle in the ActiveList class it receives the value just fine. 当我分配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);
    }
}

However, when I try to use those values in my main class GraphicGen , the currentActiveList returns null values for all of its indexes. 然而,当我尝试在我的主类中使用这些值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);
    }
}

The random generator method is called by the action listener. 动作生成器将调用随机生成器方法。

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();
    }
}

Is this a scoping or referencing problem? 这是范围界定或引用问题吗? I'm really at a loss here. 我真的很茫然。

Your actual problem is quite unclear, but just reading the first two methods is enough to find what, I suppose, is a bug: 您的实际问题还不清楚,但是仅阅读前两种方法就足以发现我认为是一个错误:

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

the above code is completely useless. 上面的代码完全没用。 The default value of an element of an array of objects is null. 对象数组的元素的默认值为null。 So the loop assigns null to a variable wich is already 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;
    }
}

If your list only contains null, the rectangle will be stored at index 0, and the loop will stop. 如果列表仅包含null,则矩形将存储在索引0处,并且循环将停止。 For all the susequent calls to this method, the loop will find that the element at index 0 is not null, and will thus store x at the last index of the array, and then at the first non-null index. 对于此方法的所有后续调用,循环将发现索引0处的元素不为null,因此将x存储在数组的最后一个索引处,然后存储在第一个非null索引处。

I don't know exactly what you're trying to achieve, and what the actual problem is, but you should probably forget about implementing your own list based on an array, and use an ArrayList instead. 我不确切地知道您要实现的目标以及实际的问题是什么,但是您可能应该忘记基于数组来实现自己的列表,而应该使用ArrayList。

Here: 这里:

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

ButtonPrompt extends GraphicGen , which is a JPanel . ButtonPrompt 扩展了 GraphicGen ,它是一个JPanel In ButtonPrompt 's constructor, you created a JFrame and added two JButton s to it. ButtonPrompt的构造函数中,您创建了一个JFrame并向其中添加了两个JButton

So when your app starts, there will be two JFrames on the screen, one is mainFrame which contains a GraphicGen , the other is buttonPrompter which contains two buttons. 因此,当您的应用程序启动时,屏幕上将有两个JFrame,一个是mainFrame ,其中包含一个GraphicGen ,另一个是buttonPrompter ,其中包含两个按钮。

When you click on the button, the actionPerformed() is called and it's actually calling the callGenRandom() of the buttonPrompter -- if the random generation logic is correct, the generated Rectangles are added to buttonPrompter . 当您单击按钮时,会调用actionPerformed() ,并且实际上是在调用buttonPromptercallGenRandom()如果随机生成逻辑正确,则将生成的矩形添加到buttonPrompter But you didn't add this buttonPrompter to any one of the JFrame s, you won't see it. 但是您没有将此buttonPrompter添加到任何一个JFrame ,您将看不到它。


What you may want: 您可能想要什么:

ButtonPrompt doesn't extend GraphicGen , instead, give ButtonPrompt a reference of the GraphicGen you added to the mainFrame . ButtonPrompt不延长GraphicGen ,而是给ButtonPrompt的的参考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);

        ......
    }
}

and in your main() : 并在您的main()

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

What's more, the code has other problems. 而且,代码还有其他问题。

For example, GraphicGen is a JPanel , main class and it has a field of a JFrame which actually contains the GraphicGen instance when app runs -- this looks bad. 例如, GraphicGenJPanel主类,它具有JFrame的字段,该字段实际上在应用程序运行时包含GraphicGen实例-这看起来很糟。 I don't know much of Swing... Is it a must to call the containing JFrame 's repaint() instead of just calling the JPanel 's repaint() , if it has? 我对Swing不太了解...是否必须调用包含JFramerepaint()而不是仅调用JPanelrepaint() (如果有)?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM