2017-04-06 31 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