java - 我无法从不同类的数组中提取值
问题描述
数组 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);
}
}
解决方案
我用二维数组制作了一个小测试程序
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
}
}
}
}
编辑:
尽我所能告诉您正在尝试创建基于网格的游戏。当您单击网格中的一个单元格时,该单元格会变为红色。有两种常见的方法来解决这个问题:
Use components.
在这种方法中,您有一个使用 a 的父面板,GridLayout
并为网格中的每个单元格添加一个子面板。您还可以将 MouseListener 添加到每个子面板。当您单击子面板时,您会将面板的背景更改为红色。Do custom painting
. 在这种方法中,您只有一个 JPanel。此类为网格中每个单元格的“状态”保留一个 2D 数组。您将单个 MouseListener 添加到面板。当您单击面板时,您确定单击了哪个单元格,然后更新该单元格的状态。在 paintComponent() 方法中,您遍历 2D 数组并绘制状态已更改的每个单元格。
您的方法似乎是两者之间的某种混合,并且不起作用。
推荐阅读
- javascript - 用于嵌入重复 html 元素的尽可能简单的模板引擎
- pandas - 重塑 Pandas 数据框(部分转置)
- python - 如何按列值过滤 multiIndexed pandas DataFrame
- bash - 如何从 ifconfig -a 创建一个列表?
- javascript - 添加 Async/Await 以响应获取请求
- r - 在R中重新排列矩阵的行
- ios - 如何创建可中断/可取消的自定义视图控制器转换?
- amazon-web-services - AWS SQS 是否跨区域复制消息?
- pyodbc - FreeTDS ODBC + pyodbc 是否支持表值参数 (TVP)?
- sql - SQL 从电子邮件地址计算电子邮件域