2015-01-20 5 views
0

2 개의 마우스 누름이있는 원을 지정할 수있는 프로그램을 작성하려고합니다. 첫 번째는 가운데에, 두 번째는 주변에있는 점에 대해 쓰려고합니다. 제가 작성한 프로그램은 이것입니다.MouseListener를 사용하여 원을 그립니 까?

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

public class CircleFrame extends JFrame 
{ 
    public CircleFrame() 
    { 
     circle = new Ellipse2D.Double(); 
     hasCenter = false; 

     createComponent(); 
     setSize(400, 400); 
    } 

    private void createComponent() 
    { 

     class CircleComponent extends JComponent 
     { 
      public void paintComponent(Graphics g) 
      { 
       Graphics2D g2 = (Graphics2D) g; 
       circle.setFrame(xTop, yTop, radius*2, radius*2); 
       g2.draw(circle); 
      } 
     } 

     class MousePressListener1 extends MouseAdapter 
     { 
      public void mousePressed(MouseEvent event) 
      { 
       if(!hasCenter) 
       { 

        xCenter = event.getX(); 
        yCenter = event.getY(); 
        hasCenter = true; 
       } 
      } 
     } 

     class MousePressListener2 extends MouseAdapter 
     { 
      public void mousePressed(MouseEvent event) 
      { 

       if (hasCenter) 
       { 
        xOut = event.getX(); 
        yOut = event.getY(); 

        xTop = xCenter - Math.abs(xOut - xCenter); 
        yTop = yCenter - Math.abs(yOut - yCenter); 

        radius = 
       Math.sqrt((xOut - xCenter)*(xOut - xCenter) + (yOut - yCenter)*(yOut - yCenter)); 

        hasCenter = false; 

       } 
      } 
     } 

     addMouseListener(new MousePressListener1()); 
     addMouseListener(new MousePressListener2()); 

     CircleComponent component = new CircleComponent(); 
     add(component); 
    } 

    private double xTop; 
    private double yTop; 
    private int xCenter; 
    private int yCenter; 
    private int xOut; 
    private int yOut; 
    private Ellipse2D.Double circle; 
    private double radius; 
    private boolean hasCenter; 
} 

는 그리고 이것은 어떻게 든 그것은 단지 빈 프레임을 보여줍니다 메인 클래스

import javax.swing.JFrame; 

public class CircleFrameViewer 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new CircleFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

, 그리고 더 클릭 아무것도 일하지 않습니다.

누구든지 나를 도와 줄 수 있습니까?

답변

1

두 개의 리스너를 사용하지 마십시오. 한 개의 리스너는 마우스 이벤트가 발생할 때마다 호출됩니다.

MouseEvent은 해당 요소를 생성 한 구성 요소에 따라 다릅니다. 즉, 청취자를 CircleComponent에 입력해야합니다.

UI를 업데이트하려면 repaint으로 전화하십시오. 예를 들어

뭔가 등 ...

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test2 { 

    public static void main(String[] args) { 
     new Test2(); 
    } 

    public Test2() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private Point centerPoint; 
     private Shape circle; 

     public TestPane() { 
      addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        if (centerPoint == null) { 
         centerPoint = e.getPoint(); 
         repaint(); 
        } else { 
         double xTop = Math.min(e.getPoint().x, centerPoint.x); 
         double yTop = Math.min(e.getPoint().y, centerPoint.y); 
         double xBottom = Math.max(e.getPoint().x, centerPoint.x); 
         double yBottom = Math.max(e.getPoint().y, centerPoint.y); 

         double radius = Math.max(xBottom - xTop, yBottom - yTop); 
         xTop = centerPoint.x - radius; 
         yTop = centerPoint.y - radius; 

         radius *= 2; 

         circle = new Ellipse2D.Double(xTop, yTop, radius, radius); 
         repaint(); 
        } 
       } 

      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (circle != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.draw(circle); 
       g2d.dispose(); 
      } 
     } 

    } 

} 
+0

와우,이 마법처럼 작동합니다. MouseEvent 컨텍스트 및 UI 업데이트를 기록합니다. 정말 고마워! –

관련 문제