0

私はこれを理解しようとして、過去1日半の間グーグルを検索してきました。ご覧のとおり、mouseClicked で変数 clickcolumnindex と clickrowindex を更新して、mouseClicked メソッドの replaint() メソッドを更新し、別の列/行内にペイント表示によって作成されたカウンターを表示しようとしています。

いろいろ試してみた結果、これは本当に簡単な修正かもしれないと思います。

助けていただければ幸いです。

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

            class GridPanel extends JPanel implements MouseListener
            {
                int numCols;
                int numRows;
                int w;
                int h;
                int x;
                int y;
                int clickcolumnindex;
                int clickrowindex;


                public void mouseReleased(MouseEvent event)
                {
                    System.out.println("Mouse released.");
                }
                public void mousePressed(MouseEvent event)
                {
                    System.out.println("Mouse Pressed");
                }
                public void mouseClicked(MouseEvent event)
                {
                    int clickcolumnindex = 7 * x / getWidth();
                    int clickrowindex = 5 * y / getHeight();
                    int x = event.getX();
                    int y = event.getY();
                    System.out.println("x position of click is: " +x);
                    System.out.println("y position of click is: " +y);
                    System.out.println("Click is in column " +clickcolumnindex);
                    System.out.println("Click is in row " +clickrowindex);
                    repaint();

                }


   public void mouseReleased(MouseEvent event) {
      System.out.println("Mouse released.");
   }

   public void mousePressed(MouseEvent event) {
      System.out.println("Mouse Pressed");
   }

   public void mouseClicked(MouseEvent event) {
      int x = event.getX();
      int y = event.getY();
      System.out.println("x position of click is: " + x);
      System.out.println("y position of click is: " + y);
      System.out.println("Click is in column " + clickcolumnindex);
      System.out.println("Click is in row " + clickrowindex);
      repaint();
   }

   public void mouseEntered(MouseEvent event) {
      System.out.println("Mouse entered.");
   }

   public void mouseExited(MouseEvent event) {
      System.out.println("Mouse exited.");
   }

   public GridPanel(int nc, int nr) {
      numCols = nc;
      numRows = nr;
      addMouseListener(this);
   }

   Rectangle getRect(int thisCol, int thisRow) {
      // if input is out of range, return "null"
      if (thisCol < 0 || thisRow < 0)
         return null;
      if (thisCol >= numCols || thisRow >= numRows)
         return null;
      // otherwise, make and return the Rectangle
      int w = getWidth() / numCols;
      int h = getHeight() / numRows;
      int x = thisCol * w;
      int y = thisRow * h;
      Rectangle myRect = new Rectangle(x, y, w, h);
      return myRect;
   }

   public void paint(Graphics g) {
      g.setColor(Color.gray);
      g.fillRect(0, 0, getWidth(), getHeight());
      g.setColor(Color.black);
      Graphics2D g2 = (Graphics2D) g;
      // we'll use Graphics2D for it's "draw" method -
      // neater than the Graphics "drawRect" suppled
      // (which you could also use)
      for (int i = 0; i < numCols; i++) {
         for (int j = 0; j < numRows; j++) {
            Rectangle r = getRect(i, j);
            g2.draw(r);
         }
      }
      g2.setColor(Color.blue);
      Rectangle r1 = getRect(clickcolumnindex, clickrowindex);
      g2.fillOval(r1.x, r1.y, r1.width, r1.height);
      System.out.println("variable updates " + clickcolumnindex + clickrowindex);
   }

   // copied from the W2MouseEvents for convenience
   // (so we can run the program from GridPanel class too!)
   public static void main(String[] args) {
      W2MouseEvents w = new W2MouseEvents();
      w.setVisible(true);
   }
}

W2MouseEvents.java:

import javax.swing.JFrame;

public class W2MouseEvents extends JFrame {
   GridPanel myGridPanel;

   public static void main(String[] args) {
      W2MouseEvents w = new W2MouseEvents();
      w.setVisible(true);
   }

   public W2MouseEvents() {
      setTitle("Workshop 2 (Mouse Events): starting code");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(500, 400);
      setLocation(300, 300);
      myGridPanel = new GridPanel(7, 5);
      add(myGridPanel);
   }

}
4

3 に答える 3

3

少なくとも2つの問題があります。変数が魔法のように自動更新されない。が変更された場合、右側にxある変数は(同じスコープ内にあると仮定して)更新されません。x明確にするために:

int x = 4;
int var = x + 1; // var == 5
x = 5 // var still is 5, not 6

x(「クラスのインスタンスの属性」のように)「グローバルに」変更したいy場合、対処しなければならない2番目の問題は次のとおりです。

public void mouseClicked(MouseEvent event)
{
    int x = event.getX();
    int y = event.getY();
    // ...
}

ここで何が起こるかというと、2つの新しいローカル変数xを宣言しyますが、それらに割り当てる値が何であれ、「グローバル」変数xでありy、宣言を省略しない限り変更されませんint。mouseClicked / mousePressed / ...メソッドのいずれかの値を再計算する場合、これは問題ではありません。clickColumnIndexclickRowIndex

編集 私はあなたがの計算clickColumnIndexとその兄弟をmouseClickedメソッドに移したのを見ます。しかし、上記のように、「グローバル」変数を非表示にする2つの新しい変数を作成しています。を削除するだけです。int

于 2012-08-04T15:56:14.363 に答える
1

ステートメント:

   int clickcolumnindex = 7 * x / getWidth();
   int clickrowindex = 5 * y / getHeight();

コンストラクター、メソッド、または静的初期化ブロックの外では許可されません。

HoverMeister が示すように、これらは 1 回だけ割り当てられます。これらの変数とそれに続く repaint() を更新するための別のメソッドを用意しないのはなぜですか?

于 2012-08-04T15:57:01.067 に答える
1

マウス イベントが発生する前に、宣言時に clickcolumnindex を設定します。代わりに、マウスリスナーで設定する必要があります。

つまり、これは無意味です。

        class GridPanel extends JPanel implements MouseListener
        {
            int numCols;
            int numRows;
            int w;
            int h;
            int x;
            int y;
            int clickcolumnindex = 7 * x / getWidth();
            int clickrowindex = 5 * y / getHeight();

この時点で x は 0 であり、 getWidth() もそうです (ここでゼロ除算エラーが発生しないことに驚きました)。

代わりに、MouseListener のmousePressed(...)メソッドで clickXXXindex を設定します。前者は、マウスを押した後にマウスを動かすかどうかについてそれほどうるさくないので、mousePressed(...)むしろ使用することを好みます。mouseClicked(...)

paintComponent(...)また、JPanel のメソッドではなく、JPanel のメソッドで描画を行う必要がありますpaint(...)

于 2012-08-04T15:44:29.520 に答える