0

mouseClicks をカウントしようとしていますが、クリックするたびにカウンターが 2 ずつ増加する理由がわかりません。getClickCount() を試してみましたが、必要なものでもありません。

カウント後の私の目標: カウンターを使用して、異なるクリック数で異なるものをペイントします。1 番目と 2 番目は常に drawLine() の座標を取得し、3 番目のクリックは drawRect() を取得するとします。

package graphics_training_painting;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;

public class U4 extends Canvas implements MouseListener{
    private int x1;
    private int y1;
    private int x2;
    private int y2;
    private int counter = 0;

    public U4() {
        setBackground(Color.white);
    }

    public static void main(String[] args) {
        U4 u = new U4();
        JFrame f = new JFrame();
        f.add(u);
        f.setSize(800, 600);
        f.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        counter++;
        System.out.println(counter);
    }

    @Override
    public void mouseEntered(MouseEvent e) {


    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
/*      x1 = e.getX();
        y1 = e.getY();*/
    }

    @Override
    public void mouseReleased(MouseEvent e) {
/*      x2 = e.getX();
        y2 = e.getY();
        repaint();*/        
    }

    public void paint(Graphics g) {
        addMouseListener(this);
        g.setColor(Color.blue);
        g.drawLine(x1, y1, x2, y2);

    }   
}

助けや提案をありがとう、ティミー!

4

1 に答える 1

4

Paint メソッドに MouseListener を追加しないでください。これにより、多くのリスナーが追加され、アクティブ化されるたびにカウンターがインクリメントされます。

paint がいつ呼び出されるかを制御することはできず、典型的なプログラムの実行中に何度も呼び出される可能性があることを知っておく必要があります。このような理由から、プログラム ロジック、状態変更コード、またはコンポーネントの作成をこのメソッド内に配置しないでください。コンストラクターなど、一度呼び出される初期化コードに MouseListener を追加します。

余談ですが、現在行っているように AWT と Swing コンポーネントを混在させたくはありません。代わりに、U4 クラスで JPanel を拡張し、そのpaintComponentメソッドで描画を行う必要があります。

したがって、これを変更します。

public U4() {
    setBackground(Color.white);
}


// ...

public void paint(Graphics g) {
    addMouseListener(this);
    g.setColor(Color.blue);
    g.drawLine(x1, y1, x2, y2);
} 

これに:

public U4() {
    setBackground(Color.white);
    addMouseListener(this);
}


// ...

public void paint(Graphics g) {
    //  addMouseListener(this);
    super.paint(g); 
    g.setColor(Color.blue);
    g.drawLine(x1, y1, x2, y2);
} 

次に、私が推奨した変更を行います

何かのようなもの:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class U4b extends JPanel {
   private static final Color BG = Color.white;
   private static final Color DRAW_COLOR = Color.red;
   private static final int PREF_W = 800;
   private static final int PREF_H = 600;
   private static final Stroke BASIC_STROKE = new BasicStroke(3f);
   private int counter = 0;
   private int x1 = 0;
   private int y1 = 0;
   private int x2 = 0;
   private int y2 = 0;

   public U4b() {
      setBackground(BG);
      MyMouseListener myMouseListener = new MyMouseListener();
      addMouseListener(myMouseListener);
      addMouseMotionListener(myMouseListener);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setColor(DRAW_COLOR);
      g2.setStroke(BASIC_STROKE);
      g2.drawLine(x1, y1, x2, y2);
   }

   private class MyMouseListener extends MouseAdapter {
      @Override
      public void mousePressed(MouseEvent e) {
         counter++;
         System.out.println("Counter: " + counter);
         x1 = e.getX();
         y1 = e.getY();
         x2 = x1;
         y2 = y1;
      }

      @Override
      public void mouseDragged(MouseEvent e) {
         x2 = e.getX();
         y2 = e.getY();
         repaint();
      }

      @Override
      public void mouseReleased(MouseEvent e) {
         x2 = e.getX();
         y2 = e.getY();
         repaint();
      }

   }

   private static void createAndShowGui() {
      U4b mainPanel = new U4b();

      JFrame frame = new JFrame("U4b");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2014-11-08T15:56:15.977 に答える