2014-05-12 2 views
1

나는 Boy1을 움직이기 위해 노력하고 있지만 두 번째 클래스에서는 setX 아래에 줄 바꿈이 나타납니다. 누구 잘못 알아요?KeyListener를 사용하여 이미지를 이동하려고하는데 오류가 발생합니까?

퍼스트 클래스 :

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class MyGame extends JPanel implements ActionListener, KeyListener { 
    Timer t = new Timer(5, this); 
    int x = 0, y = 0, velx =0, vely =0; 

    public MyGame() { 
     t.start(); 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.fillRect(x,y,50,30); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(x < 0) 
     { 
      velx=0; 
      x = 0; 
     } 

     if(x > 530) 
     { 
      velx=0; 
      x = 530;  
     } 

     if(y < 0) 
     { 
      vely=0; 
      y = 0; 
     } 

     if(y > 330) 
     { 
      vely=0; 
      y = 330;  
     } 

     x += velx; 
     y += vely; 
     repaint(); 
    } 

    public void keyPressed(KeyEvent e) { 
     int code = e.getKeyCode(); 

     if (code == KeyEvent.VK_DOWN){ 
      vely = 1; 
      velx = 0; 
     } 
     if (code == KeyEvent.VK_UP){ 
      vely = -1; 
      velx = 0; 
     } 
     if (code == KeyEvent.VK_LEFT){ 
      vely = 0; 
      velx = -1; 
     } 
     if (code == KeyEvent.VK_RIGHT){ 
      vely = 0; 
      velx = 1; 
     } 
    } 
    public void keyTyped(KeyEvent e) {} 
    public void keyReleased(KeyEvent e) { 
     velx=0; 
     vely=0; 
    } 


    public static void main (String arge[]){ 

     JFrame f = new JFrame(); 
     MyGame s = new MyGame(); 
     f.add(s); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(600,400); 
     f.setVisible(true); 

    } 
} 

문제는이 마지막 클래스입니다. 아마도 KeyAdapter가 필요합니까? 그러나 나는 그것을 시도하고 그것이 완전히 작동하지 않는 것 같다.

+0

'하지만 setX.'에서 수정 지시를 받고 있어요 두 번째 클래스 -나요 당신은'setX (...)'메소드를 생성 할까? – camickr

+0

감사하지만 전 완전히 다른 방향으로갔습니다. 훨씬 간단한 방법. 그것을보고 싶다면 내 마지막 게시물을 볼 수 있습니다. – Renox

+0

오래된 구식 기술인 애플릿을 사용하는 것으로 되돌아 간다고해도 더 간단한 방법은 아닙니다. 스윙을 올바르게 사용하는 방법을 배우려면 애플릿으로 수행중인 모든 작업을 취소해야합니다. – camickr

답변

0

컴파일러가 이유로 플래그를 지정합니다. 클래스에 포함되지 않은 변수가있는 것처럼 변수의 메서드를 호출하려고합니다. 다른 클래스에 의해 유지됩니다. 그리고 이것은 Java의 Kosher가 아닙니다.

외부에서 클래스가 호출 할 수있는 변수를 포함하는 클래스에 외부 클래스가 레이블을 이동할 수 있도록 허용해야합니다. 그런 다음 컨트롤 개체 (수신기)에 이러한 메서드가있는 클래스의 인스턴스를 지정합니다.

일반적으로 Key Binding을 사용하고 KeyListener를 사용하지 않는 것이 좋습니다.


내가 당신에게 JPanel의 주위의 JLabel를 이동하는 키 바인딩을 사용하는 코드의 예를 제공 할 수 있습니다 :

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.EnumMap; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class AnimateExample extends JPanel { 
    public static final String DUKE_IMG_PATH = // https://duke.kenai.com/iconSized/duke.gif 
     "https://duke.kenai.com/iconSized/duke4.gif"; 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 800; 
    private static final int TIMER_DELAY = 20; 
    private static final String KEY_DOWN = "key down"; 
    private static final String KEY_RELEASE = "key release"; 
    public static final int TRANSLATE_SCALE = 3; 
    private static final String BACKGROUND_STRING = "Use Arrow Keys to Move Image"; 
    private static final Font BG_STRING_FONT = new Font(Font.SANS_SERIF, 
     Font.BOLD, 32); 
    private EnumMap<Direction, Boolean> dirMap = 
     new EnumMap<AnimateExample.Direction, Boolean>(Direction.class); 
    private BufferedImage image = null; 
    private int imgX = 0; 
    private int imgY = 0; 
    private int bgStringX; 
    private int bgStringY; 

    public AnimateExample() { 
     for (Direction dir : Direction.values()) { 
     dirMap.put(dir, Boolean.FALSE); 
     } 
     try { 
     URL imgUrl = new URL(DUKE_IMG_PATH); 
     image = ImageIO.read(imgUrl); 
     Icon icon = new ImageIcon(image); 
     JOptionPane.showMessageDialog(null, icon); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

     new Timer(TIMER_DELAY, new TimerListener()).start(); 

     // here we set up our key bindings 
     int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = getInputMap(condition); 
     ActionMap actionMap = getActionMap(); 
     for (final Direction dir : Direction.values()) { 

     // for the key down key stroke 
     KeyStroke keyStroke = KeyStroke.getKeyStroke(dir.getKeyCode(), 0, 
       false); 
     inputMap.put(keyStroke, dir.name() + KEY_DOWN); 
     actionMap.put(dir.name() + KEY_DOWN, new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       dirMap.put(dir, true); 
      } 
     }); 

     // for the key release key stroke 
     keyStroke = KeyStroke.getKeyStroke(dir.getKeyCode(), 0, true); 
     inputMap.put(keyStroke, dir.name() + KEY_RELEASE); 
     actionMap.put(dir.name() + KEY_RELEASE, new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       dirMap.put(dir, false); 
      } 
     }); 
     } 

     FontMetrics fontMetrics = getFontMetrics(BG_STRING_FONT); 
     int w = fontMetrics.stringWidth(BACKGROUND_STRING); 
     int h = fontMetrics.getHeight(); 

     bgStringX = (PREF_W - w)/2; 
     bgStringY = (PREF_H - h)/2; 
    } 

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

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g.setFont(BG_STRING_FONT); 
     g.setColor(Color.LIGHT_GRAY); 
     g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
      RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     g.drawString(BACKGROUND_STRING, bgStringX, bgStringY); 

     if (image != null) { 
     g.drawImage(image, imgX, imgY, this); 
     } 
    } 

    private class TimerListener implements ActionListener { 
     public void actionPerformed(java.awt.event.ActionEvent e) { 
     for (Direction dir : Direction.values()) { 
      if (dirMap.get(dir)) { 
       imgX += dir.getX() * TRANSLATE_SCALE; 
       imgY += dir.getY() * TRANSLATE_SCALE; 
      } 
     } 
     repaint(); 
     }; 
    } 

    enum Direction { 
     Up(KeyEvent.VK_UP, 0, -1), Down(KeyEvent.VK_DOWN, 0, 1), Left(
      KeyEvent.VK_LEFT, -1, 0), Right(KeyEvent.VK_RIGHT, 1, 0); 

     private int keyCode; 
     private int x; 
     private int y; 

     private Direction(int keyCode, int x, int y) { 
     this.keyCode = keyCode; 
     this.x = x; 
     this.y = y; 
     } 

     public int getKeyCode() { 
     return keyCode; 
     } 

     public int getX() { 
     return x; 
     } 

     public int getY() { 
     return y; 
     } 

    } 

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

     JFrame frame = new JFrame("Animate Example"); 
     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

공개 메소드는 어떻게 만들 수 있습니까? 네가 줄 수있는 링크가 있니? – Renox

+0

@Renox : [Java Links] (http://stackoverflow.com/tags/java/info), [The Java Tutorials] (http://docs.oracle.com/javase/tutorial/), [The Really Big 색인] (http://docs.oracle.com/javase/tutorial/reallybigindex.html), [정의 방법] (http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html)을 참조하십시오. –

+0

그냥 거기에 수입 방법이 있는지 확인하려면? – Renox

관련 문제