有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我不能移动数组初始值设定项?

每当我试图移动数组lifegrid时,编译器就会给出错误,并且窗口出现问题。不确定数组与此有什么关系,因为我还没有使用它来更改显示的信息。 我希望能够在类LifeRunningCode中调用我的代码,但因为我的数组是在MyPanel中定义的,所以它在CreateAndShowGUI中不可见。我需要它对两种方法都可见。我能把它放在主方法之前吗

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SwingPaintDemo3 {

  public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }

  static void createAndShowGUI() {
    System.out.println("Created GUI on EDT? " + SwingUtilities.isEventDispatchThread());
    JFrame f = new JFrame("Swing Paint Demo");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new MyPanel());
    f.pack();
    JPanel subPanel = new JPanel();

    JButton seed = new JButton("SEED");
    subPanel.add(seed);
    seed.setPreferredSize(new Dimension(70, 50));
    seed.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent ae) {
        System.out.println("Seed");
      }
    });
    JButton start = new JButton("START");
    subPanel.add(start);
    start.setPreferredSize(new Dimension(70, 50));
    start.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent ae1) {
        System.out.println("Start");
        //lifegrid = LifeRunningCode.changeValues(lifegrid);
      }
    });
    start.setPreferredSize(new Dimension(70, 50));
    JButton stop = new JButton("STOP");
    subPanel.add(stop);
    stop.setPreferredSize(new Dimension(70, 50));
    JButton reset = new JButton("RESET");
    subPanel.add(reset);
    reset.setPreferredSize(new Dimension(70, 50));
    f.add(subPanel, BorderLayout.EAST);

    f.setVisible(true);

  }
}

class MyPanel extends JPanel {
  int lifegrid[][][] = new int[62][42][2];

  int squareX = 1280;
  int squareY = 800;
  int gridX = 0;
  int gridY = 0;

  public MyPanel() {

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

  public Dimension getPreferredSize() {
    return new Dimension(1280, 800);
  }

  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.RED);
    g.fillRect(squareX, squareY, 13, 13);
    g.setColor(Color.BLACK);
    g.drawRect(squareX, squareY, 13, 13);
  }
}

共 (1) 个答案

  1. # 1 楼答案

    所有UI对象都在createAndShowGUI方法中进行了本地化

    如果需要访问MyPanel类实例中的数组,应该:

    1. MyPanel中为此数组创建一个getter
    2. 在主类SwingPaintDemo3中存储MyPanel的实例,并根据需要引用它:
    // MyPanel
    class MyPanel extends JPanel {
    // ...
        public int[][][] getLifegrid() {
            return lifegrid;
        }
    }
    
    // SwingPaintDemo3
    
    public class SwingPaintDemo3 {
        static MyPanel myPanel = new MyPanel();
    
        static void createAndShowGUI() {
            System.out.println("Created GUI on EDT? " + SwingUtilities.isEventDispatchThread());
            JFrame f = new JFrame("Swing Paint Demo");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(myPanel);
            // ...
            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae1) {
                    System.out.println("Start");
                    LifeRunningCode.changeValues(myPanel.getLifegrid());
                }
            });
            // ...
        }
    }