2014-01-19 6 views
1

여기 내 문제가 있습니다. 변수 rect은 마우스 동작을 사용하여 움직일 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 아마도 나는 MouseListener이 어떻게 작동하는지 제대로 이해하지 못했습니다.핑퐁을 움직이는 직사각형을 얻는 방법?

public class CreppyRectangle extends JComponent { 
private int viteza = 15; 
private int yPosL = 100; 
Rectangle2D rect; 
Graphics2D g3d; 
int lungimea = 40; 
int latimea = 10; 
int x = 0; 
int y = 100; 
public static void main(String[] args) { 
    new CreppyRectangle(); 
} 

public CreppyRectangle() { 
    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 

     } 
     public void mouseReleased(MouseEvent e) { 

     } 
    }); 
    addMouseMotionListener(new MouseAdapter() { 
     public void mouseDragged(MouseEvent e) { 
      yPosL = e.getX(); 

      repaint(x, e.getX(), latimea, lungimea); 
      System.out.println(e.getX()); 
     } 
    }); 

    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame("Testing"); 
      final TestPane misha = new TestPane(Color.BLACK); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(misha); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

public class TestPane extends JPanel { 

    private int xPos; 
    private int yPos; 

    private int size = 10 ; 
    private int xDelta = 5; 
    private int yDelta = 5; 

    public TestPane(Color foreground) { 
     setForeground(foreground); 

     Timer timer = new Timer(viteza , new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       xPos += xDelta; 
       yPos += yDelta; 
       if (xPos < 10) { 
        xPos = 10; 
        xDelta *= -1; 
        System.out.println(xDelta); 
       } else if (xPos + size > getWidth()) { 
        xPos = getWidth() - size; 
        xDelta *= -1; 
       } else if (yPos < 0) { 
        yPos = 0; 
        yDelta *= -1; 
        System.out.println(xDelta); 
       } else if (yPos + size > getHeight()) { 
        yPos = getHeight() - size; 
        yDelta *= -1; 
       } 
       repaint(); 
      } 
     }); 
     timer.setRepeats(true); 
     timer.setCoalesce(true); 
     timer.start(); 
    } 

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

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g3d = (Graphics2D) g.create(); 
     rect = new Rectangle2D.Double(x, yPosL, latimea, lungimea); 
     g3d.draw(rect); 
     g3d.fill(rect); 
     g2d.setColor(getForeground()); 
     g2d.drawRect(xPos, yPos, size, size); 
     g2d.fillRect(xPos, yPos, size, size); 
     g2d.dispose(); 
    } 
} 
} 
+0

보조 메모로 - 앞으로는 중간 통제가 필요할 것입니다. 이렇게하면 컨트롤 구성표를 쉽게 바꿀 수 있습니다 (예 : 키보드 컨트롤). 그렇게하지 않으면 xbox 360 컨트롤러에서만 작동하는 모든 Windows 게임과 같이 잠긴 컨트롤이 생길 수 있습니다. –

답변

3

기본적으로, 당신은 실제로 때문에, 마우스 이벤트를 듣고 할 수있는 아무것도, 아무것도 CreppyRectangle를 추가하지 않습니다.

설정이 약간 이상합니다. 난 당신이 또한 당신의 TestPane

에 모든 논리 퍼팅해야 할 때 JComponent에서 연장 괴롭 히고있는 이유를 알고하지 않습니다, 당신이 yPosL = e.getX()을하고 싶은 생각하지 않는다, 나는 당신이 yPosL = e.getY()을 시도하려는 생각 대신