Java 将JLabel矩阵转换为图形显示
我最近完成了一个项目,涉及一个JPanel,其中包含一个jLabel矩阵,每个jLabel都添加了自己的MouseListener,以便按照用户的意愿变为活动/非活动。这个项目成功了,但我收到了一些抱怨,说这个项目在旧电脑上运行得很慢,我知道我做这个项目的方式虽然简单,但效率非常低。下面是我编写的代码的简化版本: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 {
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();
}
}
}
如何确定在这两种情况下使用的正确值,以便鼠标单击将产生与原始代码相同的结果?您不需要二维数组 相反,您将使用包含
单元格
对象的数组列表
。单元格
对象可以包含两个属性:
查看中的
绘制组件示例。它展示了使用这种方法进行绘画的概念。您需要为鼠标操作添加自己的代码。好主意!我一定会调查的。哦!我发现了问题所在。我在面板上画缓冲区的大小。我问这个问题的原因是因为我上次尝试时,我的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);
}
}