2014-11-08 4 views
0

나는 mouseClicks를 계산하려고하는데 왜 내 카운터가 매번 2 씩 증가하는지 이해할 수 없습니다. 시도한 getClickCount(), 그러나 그것은 또한 내가 필요로하지 않습니다.왜 내 mouseClicked() 카운터가 2 씩 증가합니까?

계산 후 내 목표 : 카운터를 사용하여 클릭 수에 따라 다른 것들을 칠합니다. 첫 번째와 두 번째는 항상 drawLine()에 대한 좌표를 가져오고 세 번째 클릭은 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

페인트에 MouseListener를 추가하지 마십시오. 메서드! 그러면 활성화 될 때마다 카운터를 증가시키는 청취자가 많이 추가됩니다.

페인트가 호출 될 때 또는 제어 할 필요가없고 일반적인 프로그램 실행 중에 여러 번 호출 될 가능성이 있음을 알아야합니다. 이러한 이유와 다른 이유로 프로그램 논리, 상태 변경 코드 또는 구성 요소 생성을이 메서드 내에두면 안됩니다. 번인이라는 생성자와 같은 초기화 코드에 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(); 
     } 
     }); 
    } 
} 
+0

감사를 너 많이! 지금 흡수가 시작됩니다. :-) – TimmyPrograming

관련 문제