2016-06-11 2 views
-1

私は最近、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つの状況で使用するために適切な値を決定するのでしょうか?

答えて

2

2D配列は必要ありません。

代わりにCellオブジェクトを含むArrayListを使用します。

  1. セルは、それが描かれているセルの色
  2. を塗装すべき場所のサイズ/位置を表すRectangleオブジェクト:Cellオブジェクトは、2つのプロパティを含むことができます。

あなたのパネルのカスタムペイントコードは、単にArrayListを繰り返し、各セルをペイントします。

MouseListenerの場合は、マウスクリックのポイントを取得し、再度ArrayListを繰り返し、Rectangle.contains(...)メソッドを使用して、セルにマウスポイントが含まれているかどうかを確認します。適切なセルを見つけたら、処理を行います。

Draw On Componentの例を確認してください。Custom Painting Approachesにあります。このアプローチを使用して絵を描く概念を示しています。マウス操作のための独自のコードを追加する必要があります。

+0

素晴らしいアイデア!私は確かにこれを見ていきます。 – RobotKarel314

+0

ああ!私は何が間違っているかを考え出した。私はパネル上に描いたようにBufferedImageのサイズを変更していました。私が尋ねた理由は、前回試したときにgetX()とgetY()がオフになったからです。私は今なぜか分かります。しかし、私は長方形の提案を感謝します - 私はそれが私のコードを整理するのに役立つと信じています。さらに、 'getRect()'と言う理由もありました。 – RobotKarel314

関連する問題