私は最近、JLabelのマトリックスを含むJPanelを含むプロジェクトを完成させました。それぞれのJLabelには独自のMouseListenerが追加され、ユーザーの希望に応じてアクティブ/非アクティブになりました。プロジェクトは成功しましたが、古いコンピュータではプロジェクトが非常に遅いという苦情を受けましたが、私がやったやり方は簡単で、ひどく非効率でした。ここで私が書いたコードの簡易版は、次のとおりです。JLabelマトリックスをグラフィックスディスプレイに変換
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();
}
}
}
私は戻って、私はLifePanel
に1のMouseListenerを持っている、とgetX()
を使用してgetY()
ように、これを変更し、クリックされた「セル」を決定したいです(もはやJLabelを拡張しない)、そのCellの色を変更してから、パネル上にペイントします。以下のような何か:
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);
}
}
どのように私は、マウスのクリックが元のコードと同じ結果につながるように、これらの2つの状況で使用するために適切な値を決定するのでしょうか?
素晴らしいアイデア!私は確かにこれを見ていきます。 – RobotKarel314
ああ!私は何が間違っているかを考え出した。私はパネル上に描いたようにBufferedImageのサイズを変更していました。私が尋ねた理由は、前回試したときにgetX()とgetY()がオフになったからです。私は今なぜか分かります。しかし、私は長方形の提案を感謝します - 私はそれが私のコードを整理するのに役立つと信じています。さらに、 'getRect()'と言う理由もありました。 – RobotKarel314