1

私はJavaスイングで練習しています。Rectangle2Dオブジェクトの 2D 配列としてマトリックスを作成しました。MouseListenerクリックされた正方形をペイントするように設定しました。どの四角がクリックされたかをチェックする for ループを設定しました。四角をクリックすると、青く塗られます。問題は、もう一方の四角をクリックすると、最初の四角が白に変わり、もう一方の四角が青に変わることです。私の質問は、最初にクリックされた正方形の色を維持する方法は?

クラスのコードは次のとおりです (これは私のMatrica(Matrix)母国crtanjeMatrice語です。drawMatrixduzinalength

public class Matrica extends JPanel implements MouseListener {
Rectangle2D[][] matrica = new Rectangle2D[8][8];
Color boja = Color.white;
int a = 0;
int b = 0;

    public Matrica() {
        addMouseListener(this);
    }

    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.clearRect(0, 0, this.getWidth(), this.getHeight());
        crtanjeMatrice(g2);
        g2.setColor(boja);
        g2.fill(matrica[a][b]);

    }




    private void crtanjeMatrice(Graphics2D g2){
        g2.setColor(Color.black);
        int startX = 0;
        int startY =0;
        int duzina = 50;
        for(int i=0; i < matrica.length; i++){
            for(int j = 0; j < matrica.length; j++){
                matrica[i][j] = new Rectangle2D.Double(startX,startY,duzina,duzina);
                g2.draw(matrica[i][j]);
                startX = startX + duzina;
            }
            startY = startY + duzina;
            startX = 0;
        }

    }


    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        int m,n;
        int x = e.getX();
        int y = e.getY();
        for(int i = 0; i < matrica.length; i++)
        for(int j =0; j < matrica.length; j++)
            if(matrica[i][j].contains(x, y)){
                boja = Color.blue;
                a = i;
                b = j;
                repaint();
            }
    }


    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

}
4

1 に答える 1

0

paint現在、メソッドで単一のマトリックス セルをペイントしています。

g2.fill(matrica[a][b]);

ただし、どの長方形がクリックされたかを「覚えておく」必要があります。この目的のために、単純なListを使用して、既にクリックされた四角形のインデックスを格納できます。クラスに基づくクラスは、行と列のインデックス情報をリストPointに格納する優れた手段を提供します。

@Override
protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   Graphics2D g2 = (Graphics2D) g;
   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   g2.clearRect(0, 0, this.getWidth(), this.getHeight());
   crtanjeMatrice(g2);
   for (MyRowColumn index : indexList) { // MyRowColumn based on Point
     g2.setColor(Color.blue);
     g2.fill(matrica[index.x][index.y]);
   }
}

余談ですpaintが、 overrideを使用しないでください。代わりに override を使用し、子コンポーネントをレンダリングするためpaintComponentに呼び出すことを忘れ ないでください。super.paintComponent

于 2012-12-28T02:25:09.840 に答える