2014-03-01 2 views
-1

죄송합니다. 이전 질문 How to detect a key press in Java이 작동하지 않았습니다.Java v2에서 키 누르기 감지

나는 여러 동영상을 보았고 그 중 키릴 마스터에 대한 기사를 보았지만 아무도 작동하지 않았습니다. 전화해야한다는 것을 알고 있습니다.

repaint(); 

좌표를 업데이트하면 나를 표시하지 않습니다. 나는 그것이 움직 이도록하기 위해 keyListener를 사용해야 만한다는 것을 알고있다. 키를 누르고 있으면 내 (PNG) 그래픽이 선택한 방향으로 움직입니다.

또한 내 손가락이 그 키를 누르지 않을 때까지 계속 움직일 수 있습니다. 그리고 A와 D를 누르면 대각선으로 움직일 것이라고합니다.

내 코드에 어떤 문제가 있는지 알 수 없지만 여기에 내 코드가 있습니다 (이클립스 표준 kelper 7.4를 사용합니다). 나는 또한 한 번에 화면에 2 PNG 이미지를 넣으려고했는데, 그것은 단지 1을 표시했다? 내가 어떻게 그걸 막을 수 있니? 또한 내 배경이 검은 색이 아닌 이유는 무엇입니까?

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

public class window { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    JFrame f = new JFrame(); 
    f.setSize(600,600); 
    f.setBackground(Color.BLACK); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
    f.setLocationRelativeTo(null); 
    f.setResizable(true); 
    f.setAlwaysOnTop(true); 

    player player = new player(); 
    f.add(player); 
} 

}

//I do seem to have a few errors throughout my code. this is because of the KeyListener 
//The player class(this one has the keylistener problem) 

import javax.swing.*; 

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

public class player extends JPanel implements KeyListener, ActionListener{ 
private ImageIcon image; 
int x = 0; 
int y = 0; 

public boolean right = false; 
public boolean left = false; 
public player(Display f){ 
    f.addKeyListener(new KeyAdapter(){ 
     public void keyReleased(KeyEvent e){ 
      if(e.getKeyCode() == KeyEvent.VK_D){ 
       right = false; 
      } 
     }}); 


} 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    this.setBackground(Color.BLACK); 
    image = new ImageIcon("neonShip.png"); 
    image.paintIcon(this, g, x, y); 

    if(right){ 
     x += 1; 
    } 
    repaint(); 
} 
@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

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

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

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

} 

} 

//Next is the Display class 

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

public class Display extends JFrame{ 
public JPanel gp = (JPanel) getGlassPane(); 
public Images i; 
public player k; 

public Display(){ 
    i = new Images(); 
    gp.setVisible(true); 
    k = new player(this); 

    gp.setLayout(new GridLayout(1,1,0,0)); 
    this.setLayout(new GridLayout(1,1,0,0)); 

    gp.add(k); 
    this.add(i); 
} 

} 

내가 가지고있는 몇 가지 오류에 대해 너무 죄송하지만 코드 내 최선을 다했다 :

여기 내 코드입니다. 내 keyListener 또는 문제가 무엇입니까. 이 문제를 해결하는 방법을 설명하십시오.

답변

0

코드에서 두 가지 접근 방식을 시도했지만 완전히 올바르게 수행하지 않은 것처럼 보입니다.

  1. 그렇게 righttrue로 설정 될 수없는 keyPressed() 재정이 없었다 추가 익명 KeyAdapter.
  2. 또 다른 방법은 Panel/Frame 클래스를 KeyListener으로 구현하는 것입니다. 그러나 KeyListener의 모든 메서드를 스텁으로두고 addKeyListener(this)을 호출하여 playerKeyListener으로 사용하도록 알려주지 않았습니다.

또한 setBackground()은 사용자가 생각하는대로 작동하지 않기 때문에 배경이 검은 색이 아닙니다. 자세한 내용은 here을 참조하십시오.

다음은 검정색 배경 위에 'A'(또는 'a')를 누른 상태에서 원을 움직이는 간단한 예입니다. 당신이 그것을 당신이 그것을 그릴 때마다로드 할 필요가 없습니다

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

public class MyWindow extends JFrame implements KeyListener{ 
    boolean pressingA; 
    int xy; 

    public MyWindow(){ 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(200,200); 
    addKeyListener(this); //Tell the window to call the key event handlers 
    } 

    public void paint(Graphics g){ 
    //You can also manually make a black background 
    g.setColor(Color.black); 
    g.fillRect(0,0,getWidth(),getHeight()); 

    //Move the circle and make it red if 'a' is pressed 
    if(pressingA){ 
     xy = (xy+1)%50; 
     g.setColor(Color.red); 
    } else 
     g.setColor(Color.blue); 

    g.fillOval(xy+20,xy+20,100,100); 
    } 

    public void keyPressed(KeyEvent e){ 
    if(e.getKeyCode() == KeyEvent.VK_A){ 
     pressingA = true; 
     repaint(); 
    } 
    } 
    public void keyReleased(KeyEvent e){ 
    if(e.getKeyCode() == KeyEvent.VK_A){ 
     pressingA = false; 
     repaint(); 
    } 
    } 
    public void keyTyped(KeyEvent e){ 
    } 

    public static void main(String... args){ 
    new MyWindow().setVisible(true); 
    } 
} 

당신은 정말 ImageIcon 멤버 변수를해야한다. 왜 두 가지를 가질 수 없는지에 관해서는 가장 가능성이 큽니다 (예를 들어 다른 하나 위에 그림을 그렸을 때) ImageIcon의 다중 문제를 본 적이 없기 때문에 지금 테스트했을 때를 포함하여 .

P. Display 클래스가 무엇을해야하는지, Image 클래스가 무엇인지 확실하지 않습니다.

+0

훌륭한 답변을 보내 주신 user783920! 어떻게하면 다른 키를 구현하고 나타나는 흰색 플래시를 없앨 수 있습니까? 또한 어떻게 운동 속도를 높일 수 있을까요? 나는 코드를 복사 할 때 속도 변수를 보지 못했습니다. – user3343497

+0

'KeyListener'를 계속 사용하고 싶다면'e.getKeyCode(). '를 통해'switch'할 수 있습니다. 그러나 @camickr가 지적했듯이'Key Bindings '는 스윙에있어 더 나은 연습으로 간주됩니다. "속도"는 'if (pressingA)'에서 1로 하드 코딩되었습니다. "화이트 플래시"가 무슨 뜻인지 잘 모르겠습니다. – user783920

+0

좋아, 내가 keybindings 좀 봐야 겠어 '하드 코딩 된'로 무엇을 의미합니까? 나는 실제로 그것이 1 밀리 초 동안 어떻게 사라 졌는지를 의미하고 다시 돌아옵니다. 그것이 화면에없는 작은 공간을 남깁니다. 내가 어떻게 그걸 막을 수 있니? – user3343497

0

KeyListener를 사용하지 마십시오. 대신 Key Bindings을 사용해야합니다.

Keybindings를 사용해야하는 이유와 완전한 작동 예를 확인하려면 Motion Using the Keyboard을 확인하십시오.

관련 문제