2017-04-06 83 views
0

你好,我希望通過單擊向上箭頭鍵將另一個故事添加到繪製在paintComponent中的房子,並通過單擊向下箭頭鍵將其刪除。但我有關於KeyListener的問題,我不明白這個代碼需要修正什麼。如何通過KeyListener更改塗料?

import javax.swing.JComponent; import javax.swing.JFrame;

主瀏覽器類

public class HouseViewer { 

    public static void main(String[] args) { 


    JFrame frame = new JFrame(); 

    frame.setSize(700, 700); 
    frame.setTitle("Cool house program"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JComponent component = new HouseComponent(); 
    frame.add(component); 
    frame.setVisible(true); 


    } 

} 

組件類

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import javax.swing.JComponent; 
import java.awt.event.KeyListener; 



public class HouseComponent extends JComponent implements KeyListener { 

    private boolean more; 
    private boolean less; 
    private boolean def; 



    public HouseComponent(){ 
     def = true; 
     this.addKeyListener(this); 
    } 


    public void paintComponent(Graphics g){ 




    if (def) { 

     // Default 

     // 1st rectangle 
     g.drawRect(230, 180, 200, 200); 
     // roof 
     g.drawLine(230, 180, 330, 100); 
     g.drawLine(430, 180, 330, 100); 
     // door and window 
     g.drawRect(260, 280, 50, 100); 
     g.drawRect(350, 310, 45, 45); 
    } 

    if(more) {  

     // roof 
     g.drawLine(230, 180, 330, 45); 
     g.drawLine(430, 180, 330, 45); 

     // 2nd story rectangle 
     g.drawRect(230, 180, 200, 100); 

     // 1st rectangle 
     g.drawRect(230, 180 + 100, 200, 200); 


     // door and window 
     g.drawRect(260, 280 + 100, 50, 100); 
     g.drawRect(350, 310 + 100, 45, 45); 

    } 


    if (less) { 

     // 1st rectangle 
     g.drawRect(230, 180, 200, 200); 
     // roof 
     g.drawLine(230, 180, 330, 100); 
     g.drawLine(430, 180, 330, 100); 
     // door and window 
     g.drawRect(260, 280, 50, 100); 
     g.drawRect(350, 310, 45, 45); 

    } 








    } 



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



     switch(key) 
     { 

     case KeyEvent.VK_UP: 

     more = true; 
     less = false; 
     def = false; 
     repaint(); 


     case KeyEvent.VK_DOWN: 

     more = false; 
     less = true; 
     repaint(); 



    } 

    } 


    public void keyReleased(KeyEvent e) { 

    } 


    public void keyTyped(KeyEvent e) { 


    } 


} 
+0

問題是什麼? –

+0

我不知道如何讓關鍵事件改變房屋繪畫 – Darknax

+0

在每個「case」的末尾添加一個「break」。請參閱https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html – Berger

回答

0

你加任何調試代碼,看看是否正在執行監聽器的代碼?

KeyEvents被調度到焦點組件。默認情況下,JComponent不可聚焦,所以組件不會收到事件。

更好的解決方案是使用Key Bindings。即使組件沒有焦點,鍵綁定也可以工作。

閱讀有關How to Use Key Bindings的Swing教程的部分以獲取更多信息。

檢出Motion Using the Keyboard以便比較使用KeyListner和Key綁定。它將顯示你需要做什麼來使得組件可以聚焦,從而讓KeyListener工作,儘管從來沒有保證組件不會失去焦點。

+0

我不得不使用KeyListener。我可以用什麼替換JComponent? – Darknax

+0

@Darknax,剛剛在添加額外信息的答案。 – camickr

+0

哇我修好了。我所要做的就是將this.setFocusable(true)添加到構造函數中。謝謝 ! – Darknax

0

爲所有交換機機箱添加break;。同樣重命名方法paintComponentpaint

+0

我不確定,但如果您查看'paint'方法的來源,您可以在條件下看到'paintComponent'方法,因此類不能直接調用paintComponent(因爲它是受保護的),而另一個類調用'paint'方法。也許這是問題 – ZhenyaM