Java 将JLabel矩阵转换为图形显示

Java 将JLabel矩阵转换为图形显示,java,swing,graphics,Java,Swing,Graphics,我最近完成了一个项目,涉及一个JPanel,其中包含一个jLabel矩阵,每个jLabel都添加了自己的MouseListener,以便按照用户的意愿变为活动/非活动。这个项目成功了,但我收到了一些抱怨,说这个项目在旧电脑上运行得很慢,我知道我做这个项目的方式虽然简单,但效率非常低。下面是我编写的代码的简化版本: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class LifeDriver {

我最近完成了一个项目,涉及一个JPanel,其中包含一个jLabel矩阵,每个jLabel都添加了自己的MouseListener,以便按照用户的意愿变为活动/非活动。这个项目成功了,但我收到了一些抱怨,说这个项目在旧电脑上运行得很慢,我知道我做这个项目的方式虽然简单,但效率非常低。下面是我编写的代码的简化版本:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class LifeDriver {
   public static void main(String[] args) {
      JFrame frame = new JFrame("Test");
      frame.setSize(950, 850);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setContentPane(new LifePanel(40, 50));
      frame.setVisible(true);
   }
}
class LifePanel extends JPanel {
   private Cell[][] grid;
   private static int nR, nC;
   public LifePanel(int row, int column) {
      nR = row;
      nC = column;
      grid = new Cell[row][column];
      setLayout(new GridLayout(row, column, 1, 1));
      for (int r = 0; r < row; r++)
         for (int c = 0; c < column; c++)
         {
           grid[r][c] = new Cell();
           add(grid[r][c]);
         }
   }
}
class Cell extends JLabel
{
   private boolean alive;
   private static boolean mouseDown;
   public Cell() {
      setOpaque(true);
      addMouseListener(new Mouse());
      kill();
   }
   public void revive() {
      setAlive(true);
   }
   public void kill() {
      setAlive(false);
   }
   public void setAlive(boolean arg) {
      alive = arg;
      if (arg)
         setBackground(Color.RED);
      else
         setBackground(Color.WHITE);
   }
   private class Mouse extends MouseAdapter {
      public void mousePressed(MouseEvent e) {
         mouseDown = true;
         if (alive)
            kill();
         else 
            revive();
      }

      public void mouseReleased(MouseEvent e) {
         mouseDown = false;
      }

      public void mouseEntered(MouseEvent e) {
         if (mouseDown)
            if (alive)
               kill();
            else 
               revive();
      }
   }
}

如何确定在这两种情况下使用的正确值,以便鼠标单击将产生与原始代码相同的结果?

您不需要二维数组

相反,您将使用包含
单元格
对象的
数组列表
单元格
对象可以包含两个属性:

  • 一个矩形对象,表示单元格应绘制位置的大小/位置
  • 绘制单元格时单元格的颜色
  • 然后面板中的自定义绘制代码将简单地遍历ArrayList并绘制每个单元格

    对于MouseListener,您将获得鼠标单击的点,然后再次遍历ArrayList,并使用Rectangle.contains(…)方法确定单元格是否包含鼠标点。当您找到合适的单元格时,您将进行处理


    查看中的
    绘制组件
    示例。它展示了使用这种方法进行绘画的概念。您需要为鼠标操作添加自己的代码。

    好主意!我一定会调查的。哦!我发现了问题所在。我在面板上画缓冲区的大小。我问这个问题的原因是因为我上次尝试时,我的getX()和getY()都关闭了。我现在明白为什么了。然而,我非常感谢矩形的建议——我相信它将有助于清理我的代码。另外,它给了我一个理由说
    getRect()
    class LifePanel extends JPanel {
       BufferedImage myImage;
       Graphics g;
       ...
       class Mouse extends MouseAdapter {
          public void mousePressed(MouseEvent e) {
             grid[someRow][someColumn].draw(g) //use e.getX() and e.getY()
          }
          public void mouseEntered(MouseEvent e) {
             //similar to above
          }
       }
    }
    
    class Cell {
       //other methods
       public void draw(Graphics g) {
          g.setColor(myColor);
          g.fillRect(someX, someY, someWidth, someHeight);
       }
    }