Java 我无法从其他类中的数组中提取值

Java 我无法从其他类中的数组中提取值,java,arrays,swing,Java,Arrays,Swing,数组lifegrid2的打印输出只给出全部零。我在MyPanel中测试了lifegrid数组,该数组正在填充,但这些值都是零。我通过在lifegrid2中放入一些值进行检查,它们正在被擦除,所以它正在从MyPanel中恢复,但只有零。没有报告任何错误 我已经用2d数组做了一个小测试程序,它确实能把值拉过去 import javax.swing.SwingUtilities; import javax.swing.JFrame; import javax.swing.JPanel; impo

数组lifegrid2的打印输出只给出全部零。我在MyPanel中测试了lifegrid数组,该数组正在填充,但这些值都是零。我通过在lifegrid2中放入一些值进行检查,它们正在被擦除,所以它正在从MyPanel中恢复,但只有零。没有报告任何错误

我已经用2d数组做了一个小测试程序,它确实能把值拉过去

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
   import javax.swing.BorderFactory;
import javax.swing.JButton;

  import java.awt.*; 
import java.awt.event.*; 

public class SwingPaintDemo3 {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI(); 
        }
    });
}

private static void createAndShowGUI() {
    JFrame f = new JFrame("Swing Paint Demo");
    f.setPreferredSize(new Dimension(1280,800));
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new MyPanel());
    f.pack();
    f.setVisible(true);
    JPanel subPanel = new JPanel();
    JButton start = new JButton("START");
    subPanel.add(start);
    start.setPreferredSize(new Dimension(100,50));
    start.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae1) {
            System.out.println("START");
            int [][][] lifegrid2 = new int [12][12][2];
            int temp;
            
            for (int i=0; i<12; i++) {
                for (int j=0; j<12; j++) {
            **MyPanel obj = new MyPanel();
            temp = obj.lifegrid [i][j][0];
                lifegrid2 [i][j][0] = temp;**
                if (j<11) 
                    {System.out.print(lifegrid2 [j] [i] [0]);}
                else 
                    {System.out.println(lifegrid2 [j] [i] [0]);}}}
            
            
            
                                        }   
    });
    f.add(subPanel, BorderLayout.EAST);
    
} 

}




import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.SwingUtilities;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入java.awt.*;
导入java.awt.event.*;
公共类SwingPaintDemo3{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}
私有静态void createAndShowGUI(){
JFrame f=新JFrame(“Swing Paint演示”);
f、 设置首选尺寸(新尺寸(1280800));
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(新的MyPanel());
f、 包装();
f、 setVisible(真);
JPanel subPanel=新的JPanel();
JButton start=新JButton(“start”);
子面板添加(开始);
start.setPreferredSize(新维度(100,50));
start.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件ae1){
系统输出打印项次(“开始”);
int[]lifegrid2=新int[12][12][2];
内部温度;
对于(int i=0;i
我已经做了一个二维阵列的小测试程序

这是一个3D阵列

二维阵列定义为:

int [][] lifegrid2 = new int [12][12];
初始化数组的逻辑属于类的构造函数:

MyPanel()
{
    for (int i = 0; i < 12; i++) {
        for (int j = 0; j < 12; j++) {
            lifegrid [i][j] = 0)
        }
    }
}
MyPanel()
{
对于(int i=0;i<12;i++){
对于(int j=0;j<12;j++){
生命网格[i][j]=0)
}
}
}
然后,您的paintComponent()方法需要迭代二维网格,并且只绘制值为1的网格

@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
 
   for (int i = 0; i < 12; i++) {
       for (int j = 0; j < 12; j++) {
            if (lifegrid[i][j] = 1)
               // paint the grid
            }
       }
    }
}
@覆盖
受保护组件(图形g)
{
超级组件(g);
对于(int i=0;i<12;i++){
对于(int j=0;j<12;j++){
if(lifegrid[i][j]=1)
//画网格
}
}
}
}
编辑:

据我所知,您正在尝试创建一个基于网格的游戏。当您单击网格中的单元格时,该单元格将变为红色。有两种常用方法:

  • 使用组件。
    在这种方法中,您有一个使用
    网格布局的父面板
    ,您可以向网格中的每个单元格添加一个子面板。您还可以向每个子面板添加鼠标侦听器。单击子面板时,您可以将面板的背景更改为红色

  • 进行自定义绘制
    。在这种方法中,您只有一个JPanel。此类为网格中每个单元格的“状态”保留一个2D数组。您可以向面板添加一个鼠标侦听器。单击面板时,确定单击了哪个单元格,然后更新该单元格的状态。在paintComponent()中方法遍历2D数组并绘制状态已更改的每个单元格


  • 您的方法似乎是两者之间的某种混合,不起作用。

    它应该是一个3d数组。绘制部分正在做我希望它做的事情。问题是我的主要方法中的lifegrid2填充了零值。我将测试代码扩展到3d,效果很好。我还尝试了在没有lu的情况下初始化数组ckIt是一个3d阵列这不是你的问题所说的。2)你的代码中没有任何一个表示3D数组的原因。你只访问了值为0的第三个索引。绘制部分正在执行我希望它执行的操作。-你仍然不理解自定义绘制的概念。你不应该创建144个面板,让每个面板绘制一个单独的正方形。基于2D数组中的值,您应该使用单个面板绘制144个正方形中的每一个。问题是,在我的主要方法中,lifegrid2被填充为零值。这是创建int数组时的默认值,您希望值是什么?您在哪里更改值?在2个不同的数组中定义了两个不同的数组租用类。如果你更新一个类中的值,为什么你认为它会更新另一个类中的数组?这是一项正在进行的工作,数组的另一部分将被使用。我已经为此编写了代码,它很好。测试程序现在也是3d的。我知道lifegrid2从零值开始。问题是这些值操作系统在我点击鼠标的地方应该有一些1。它们在突出显示的代码中没有从MyPanel中拔出。它们在突出显示的代码中没有从MyPanel中拔出。-为什么你认为它们应该“拔出”???它们是两个独立类中的两个独立变量。我已经建议了更好的设计类的方法。发布一个适当的演示你的问题。每个问题都应该发布一个MRE。MRE迫使你简化问题。所以它是从我的面板中拉出来的,但只有零。-你为什么期望它们是任何东西但是零?当你创建一个类的新实例时,它将是0。用户还没有机会点击任何东西。你的整个设计需要重新思考。我在下面给出了一些建议。
    MyPanel()
    {
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 12; j++) {
                lifegrid [i][j] = 0)
            }
        }
    }
    
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
     
       for (int i = 0; i < 12; i++) {
           for (int j = 0; j < 12; j++) {
                if (lifegrid[i][j] = 1)
                   // paint the grid
                }
           }
        }
    }