2014-03-01 80 views
-1

很抱歉,我的上一個問題How to detect a key press in Java沒有工作。在Java v2中檢測按鍵

我看過多個視頻並看到關於此類關鍵字的文章,但都沒有工作。我知道我必須致電

repaint(); 

要更新座標,請不要在此標記我。我知道我必須使用keyListener才能讓它移動。我想要它,所以當我按住一個鍵時,我的(PNG)圖形將按照我選擇的方向移動。

另外我怎樣才能使它保持移動,直到我的手指停止按下該鍵。並說我按了A和D,它會對角移動。

我不知道我的代碼有什麼問題,但這裏是我的代碼(我使用eclipse標準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. 您添加沒有一個keyPressed()覆蓋這樣right不能設置爲true匿名KeyAdapter
  2. 另一種方法是讓您的面板/框架類實現KeyListener。但是,您只是將所有KeyListener的方法都作爲存根,並且不會撥打addKeyListener(this)來讓它知道使用player作爲KeyListener

此外,您的背景不是黑色,因爲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.S.我不確定你的Display類應該做什麼,也不知道你的Images類是什麼。

+0

謝謝user783920的一個很好的答案!我怎麼能實現其他鍵並擺脫出現的白色閃光。另外我怎麼能增加運動的速度。我在複製代碼時看不到速度變量。 – user3343497

+0

如果你想繼續使用'KeyListener',那麼你可以通過'e.getKeyCode()'做一個'switch''。然而,@camickr指出,'Key Bindings'被認爲是更好的揮杆練習。 「速度」在'if(按壓A)'中被硬編碼爲1.我不太清楚「白色閃光燈」的含義。 – user783920

+0

好吧,我會看看鍵綁定,你是什麼意思的'硬編碼'?我的意思是它是如何消失1毫秒然後回來的。在屏幕上留下一小段時間。我怎麼能阻止這個? – user3343497

0

請勿使用KeyListener。相反,你應該使用Key Bindings

檢查出Motion Using the Keyboard爲什麼Keybindings應該使用和一個完整的工作示例。