繁体   English   中英

Java对象值不一致

[英]Java Object values not consistent

我找不到其他解决方案,因为我不确定如何用足够多的词来描述它。

当我分配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();
    }
}

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

您的实际问题还不清楚,但是仅阅读前两种方法就足以发现我认为是一个错误:

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存储在数组的最后一个索引处,然后存储在第一个非null索引处。

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

这里:

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() ,并且实际上是在调用buttonPromptercallGenRandom()如果随机生成逻辑正确,则将生成的矩形添加到buttonPrompter 但是您没有将此buttonPrompter添加到任何一个JFrame ,您将看不到它。


您可能想要什么:

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

        ......
    }
}

并在您的main()

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

而且,代码还有其他问题。

例如, GraphicGenJPanel主类,它具有JFrame的字段,该字段实际上在应用程序运行时包含GraphicGen实例-这看起来很糟。 我对Swing不太了解...是否必须调用包含JFramerepaint()而不是仅调用JPanelrepaint() (如果有)?

暂无
暂无

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

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