如何访问 java 中另一个 class 的数组列表

How to access an Arraylist of another class in java

我知道这可能是一个基本问题,但我为这个问题得到的代码不适用于我的数组列表。可能有人可以帮我解决 this.I 想访问 class Testing1.Java 的数组列表 "Connection" 并在另一个名为 SQL.Java 的 class 中使用它.我的数组 "Connection" 是另一个数组 "NamedShape".

的对象

这是我的 2 个数组列表:

ArrayList<NamedShape> shapes = new ArrayList<NamedShape>();
        ArrayList<Connection> con = new ArrayList<Connection>();

        public class Connection {

            private NamedShape namedShape1;
            private NamedShape namedShape2;

            public Connection(NamedShape namedShape1, NamedShape namedShape2) {
                this.namedShape1 = namedShape1;
                this.namedShape2 = namedShape2;
            }

            public NamedShape getNamedShape1() {
                return namedShape1;
            }

            public NamedShape getNamedShape2() {
                return namedShape2;
            }

            public void setNamedShape1() {
                this.namedShape1 = namedShape1;
            }

            public void setNamedShape2() {
                this.namedShape2 = namedShape2;
            }
        }

        public class NamedShape {

            private String name;
            private Shape shape;

            public NamedShape(String name, Shape shape) {
                this.name = name;
                this.shape = shape;
            }

            public String getName() {
                return name;
            }

            public Shape getShape() {
                return shape;
            }
        }

我在 Testing1.Java 中放置了一个 getConnection 方法。数据在 Arraylist Connection 中正确插入(我没有放入代码来添加数据,但数据插入正确,这不是问题)

public ArrayList<Connection> getConnection() {
            return con;

        }

这是我的试用版 SQL.Java 但它无法识别此处的 getConnection() 方法:

import java.util.ArrayList;

public class SQL {
    private Testing1 sql;
    public SQL(){
        sql = new Testing1();
        ArrayList<Connection> con = sql.getConnection()

    }

   public static void main(String args[]){
       new Test();


   }
}

有人可以帮我解决这个问题吗?

已编辑 我已经阅读并遵循了您所说的内容,现在我有了这个,但我不知道主要内容应该如何。所以我把我的 class Testing1.java 叫到 ERDBUILDER.java。我的 ERDBUILDER class 允许我绘制形状,经过一些处理后形状存储到数组列表 Connection。然后我有我的 class SQL.java ,我想通过从 ERDBUILDER.java 调用 class SQL.java 来使用那个数组列表 Connection 但我不想java 再开一个 ERDBUILDER.java。我已经将 new SQL(); 放在主目录中,但它正在打开另一个 ERDBUILDER.java,这不是我想要的。你能建议点什么吗?我可能是一个基本问题,但我仍然找不到办法。

package project;
import java.awt.Shape;
import java.util.ArrayList;
import project.ERDBUILDER.DrawingBoard.Attribute;
import project.ERDBUILDER.DrawingBoard.Connection;
import project.ERDBUILDER.DrawingBoard.NamedShape;


public class SQL {
    
    private ERDBUILDER sql;
    public SQL(){
        sql = new ERDBUILDER();
    ArrayList<Connection> con = sql.getDrawingBoard().getConnection();
            
        for (int a = 0; a < con.size(); a++) {
                                    NamedShape f = con.get(a).getNamedShape1();
                                    Attribute g = con.get(a).getNamedShape2();
                                    String i = f.getName();
                                    String j = g.getName();

                                    Shape y = f.getShape();
                                    Shape y1 = g.getShape();

                                   
        }
    }
    
   public static void main(String args[]){

       
       
   }
}

虽然您发布在 pastebin 上的代码可以编译,但这是一个非常不寻常的模式。

您的 Testing1 class 中有多个 nested inner classes。这是有效的 Java(即它会编译),但对于您想要的可能不是必需的。

快速回答

getConnection() 在行

中不可用
ArrayList<Connection> con = sql.getConnection()

因为你的 getConnection() 方法没有定义在 class Testing1 中,而是定义在 class Testing1.DrawingBoard.Connection 的内部 class ](代码的第 342 行)。

修复

  1. 使 drawPanel 成为 Testing1 的成员变量,这样您就可以从 "outside" 访问它,或者直接将其设为 public 成员,或者通过添加一个 getDrawingBoard() 方法来 returns 它。例如

    public class Testing1 extends JFrame
    {
        private DrawingBoard drawPanel;
    
        public DrawingBoard getDrawingBoard()
        {
            return drawPanel;
        }
    
        //...The rest of your existing code except !!!
        // !!! in the Testing1 constructor at line 238 !!!
        // change          final DrawingBoard drawPanel = new DrawingBoard(); to
    
            drawPanel = new DrawingBoard();
    
        // ... and the rest of your code...
    
    }
    
  2. getConnection() 移出 Connection - 因此它是 DrawingBoard 而不是 Connection 的成员。例如(使用您现有的代码作为基础)

    //...preceding code before line 324 ...
    
    public class DrawingBoard extends JComponent
    {
    
        private static final long serialVersionUID = -4431176095451940075L;
    
        // ArrayList<Shape> shapes = new ArrayList<Shape>();
        ArrayList<Color> shapeStroke = new ArrayList<Color>();
        ArrayList<Integer> count = new ArrayList<Integer>();
        ArrayList<NamedShape> shapes = new ArrayList<NamedShape>();
        ArrayList<Connection> con = new ArrayList<Connection>();
    
        public ArrayList<Connection> getConnection()
        {
           return con;
        }
    
        public class Connection
        {
        // ... rest of your code...
    
  3. 然后,你就可以在SQL的构造函数中进行如下操作:

    public SQL(){
        sql = new Testing1();
        ArrayList<Connection> con = sql.getDrawingBoard().getConnection();
    }
    

评论

您使用的模式很难遵循和维护。 More information on when to use nested classes 在 Java 教程中可用。

特别是 - 你真的不需要 DrawingBoard 成为 Testing1 的内部 class - DrawingBoard 可以用于许多不同的应用程序,所以它不满足主要标准

nested classes enable you to logically group classes that are only used in one place

我建议进行重构 - 将 DrawingBoard 分解为一个新的 class 文件 DrawingBoard.java。把它和Testing1放在同一个包里就可以被Testing1.

使用了

我知道这个答案可能会引发更多问题 - 如果确实如此 - 请提出一个关于嵌套 classes 与在您的特定情况下导入它们以及 link 在评论...