首页 > 解决方案 > 我无法从不同类的数组中提取值

问题描述

数组 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;

导入 javax.swing.JPanel;

class MyPanel extends JPanel {

public int [][][] lifegrid = new int [12][12][2];

private int squareX = 1280;
private int squareY = 800;
private int gridX, gridY ;

public MyPanel() {

           
    addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            squareX = e.getX();
            squareY = e.getY();
                            if ((squareX>50 & squareX <550) & (squareY>50 & squareY <550) ){
                gridX =(squareX-50)/50+1;
                gridY =(squareY-50)/50+1;
                
                squareX = (squareX -50)/50 * 50 + 50;
                squareY = (squareY -50)/50 * 50 + 50;
                System.out.println(gridX + " " + gridY);
                lifegrid [gridX] [gridY] [0] = 1;
                
                repaint(squareX,squareY,50,50);}
            else {
                            }
        }
        });
     
                             }







protected void paintComponent(Graphics g) {
    super.paintComponent(g);       
    g.drawString("This is my custom Panel!",10,20);
    g.setColor(Color.RED);
    g.fillRect(squareX,squareY,48,48);
    g.setColor(Color.BLACK);
    g.drawRect(squareX,squareY,48,48);
}  
}

标签: javaarraysswing

解决方案


我用二维数组制作了一个小测试程序

int [][][] lifegrid2 = new int [12][12][2];

那是一个 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)
        }
    }
}

然后您的 paintComponent() 方法需要遍历 2D 网格并仅绘制值为 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
            }
       }
    }
}

编辑:

尽我所能告诉您正在尝试创建基于网格的游戏。当您单击网格中的一个单元格时,该单元格会变为红色。有两种常见的方法来解决这个问题:

  1. Use components.在这种方法中,您有一个使用 a 的父面板,GridLayout并为网格中的每个单元格添加一个子面板。您还可以将 MouseListener 添加到每个子面板。当您单击子面板时,您会将面板的背景更改为红色。

  2. Do custom painting. 在这种方法中,您只有一个 JPanel。此类为网格中每个单元格的“状态”保留一个 2D 数组。您将单个 MouseListener 添加到面板。当您单击面板时,您确定单击了哪个单元格,然后更新该单元格的状态。在 paintComponent() 方法中,您遍历 2D 数组并绘制状态已更改的每个单元格。

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


推荐阅读