2012-03-15 5 views
1

keyEvent를 사용하여 왼쪽으로 원을 이동하려고합니다. 지금까지 원은 창에 그려지지만 왼쪽으로 움직이지 않습니다! 문제는 컨테이너에 Window() 생성자를 추가하는 것입니다. 콘솔에 아무런 출력이 없으므로 작동하는지 알 수 없습니다. 그래서 나는 그것이 KeyEvent 클래스에 도달했다고 생각하지 않는다. 여기 내 코드는 다음과 같습니다.Java 화살표 키를 사용하여 GUI에서 원을 이동

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


public class Window extends JPanel { 

    private static Ellipse2D.Double circle; 

    public Window() { 
     super(); 
     int width = 400; 
     int height = 400; 
     circle = new Ellipse2D.Double(0.5 * width, 0.9 * height, 
       0.1 * width, 0.05 * height); 
     addKeyListener(new MoveCircle()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponents(g); 
     Graphics2D brush = (Graphics2D) g; 
     int width = getWidth(); 
     int height = getHeight(); 
     g.clearRect(0, 0, width, height); 
     brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     brush.draw(circle); 
    } 

    public class MoveCircle implements KeyListener { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println("Working on top!"); 
      if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
       System.out.println("Working on bottom!"); 
       circle.x++; 
       repaint(); 
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
      // TODO Auto-generated method stub 
     } 
    } 

    public static void main(String[] args) { 
     Window window = new Window(); 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.add(new Window()); 
     frame.addKeyEvent(window.new MoveCircle()); 
     frame.setSize(800, 700); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

답변

4

사실, 당신은 JFrameWindow을이 추가되는 일이 있지만, 초점이 JFrame에게있다, 그래서 당신은 당신의 Keyboard 그 일에 입력 할 때 Window 클래스에 부착 된 JFrame하지 KeyListener 간다 무엇. 따라서이를 극복하려면 Window 클래스의 Object에서 requestFocusInWindow()으로 전화하면됩니다. 이 코드를 사용해보십시오, EDT와 관련하여 몇 가지 수정을했습니다.

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


public class Window extends JPanel { 

    private static Ellipse2D.Double circle; 
    private JFrame frame; 

    public Window() { 
     super(); 
     int width = 400; 
     int height = 400; 
     circle = new Ellipse2D.Double(0.5 * width, 0.9 * height, 
       0.1 * width, 0.05 * height);   
    } 

    public Dimension getPreferredSize() 
    { 
     return (new Dimension(frame.getWidth(), frame.getHeight())); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponents(g); 
     Graphics2D brush = (Graphics2D) g; 
     int width = getWidth(); 
     int height = getHeight(); 
     g.clearRect(0, 0, width, height); 
     brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     brush.draw(circle); 
    } 

    public class MoveCircle implements KeyListener { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println("Working on top!"); 
      if (e.getKeyCode() == Event.ENTER) { 
       System.out.println("Working on bottom!"); 
       double newX = circle.x - 1; 
       circle.x = newX; 
       repaint(); 
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
      // TODO Auto-generated method stub 
     } 
    } 

    private void createAndDisplayGUI(Window window) 
    { 
     frame = new JFrame(); 
     Container container = frame.getContentPane();  
     container.add(window); 
     window.addKeyListener(new MoveCircle());   
     frame.setSize(800, 700); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
     window.requestFocusInWindow(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       Window window = new Window(); 
       window.createAndDisplayGUI(window); 
      } 
     }); 
    } 
} 
+0

지금 올바르게 작동하도록 수정했으며 원은 이제 왼쪽과 오른쪽으로 이동합니다. 그러나 newX = circle.x + 5.0과 같은 일을하려고합니다. 이것은 아무 것도하지 않고 원을 움직이게하는 유일한 방법은 circle.x ++입니다. 나는 그것이 얼마나 천천히 움직이는 것을 좋아하지 않는다 ...? – user1198199

+0

'newX = circle.x + 5.0; 대신'circle.x + = 5;'를 사용 해봤습니까? –

+0

아, 감사합니다. Idon't는 그것이 새로운 임무를 받아 들일 수 없었던 이유를 알고있다. 그럼 당신은 그날을 구 했으니 이제는 게임을 계속할 것입니다. 감사합니다! – user1198199

1

초점을 맞춘 구성 요소 만 키 이벤트를받습니다. 어떤 시점에서 requestFocus()를 호출해야합니다.

1

해결 방법은 KeyListener를 JFrame에 추가하는 것입니다. 이렇게하면 모든 키 스트로크는 JFrame에 포커스가있을 때 이벤트를 발생시킵니다.

+0

뜻은 frame.addKeyListeners (new MoveCircle()); 주요 방법으로? – user1198199

+0

그래, 그게 무슨 뜻인지,하지만 MoveCircle() Window에서 호출 할 수 있기 때문에이 작동하지 않을 수 있습니다. 그래서 내 해결책은'Window window = new Window(); container.add (window); frame.addKeyListener (window.new MoveCircle()); ' – Boman

+0

keyListener가 추가되었지만 이제는 원이 움직이지 않습니다. 흠 ... – user1198199

관련 문제