如何通过KeyListener更改绘图?

时间:2017-04-06 15:19:36

标签: java swing

您好我希望通过单击ARROW UP键将另一个故事添加到paintComponent中绘制的房子中,然后通过单击ARROW DOWN键将其删除。但我有关于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) {


    }


}

2 个答案:

答案 0 :(得分:0)

您是否添加了任何调试代码以查看您的侦听器代码是否正在执行?

将KeyEvents分派给具有焦点的组件。默认情况下,JComponent不可聚焦,因此组件不会接收事件。

更好的解决方案是使用Key Bindings。即使组件没有焦点,键绑定也会起作用。

阅读How to Use Key Bindings上的Swing教程中的部分以获取更多信息。

查看Motion Using the Keyboard以了解使用KeyListner和Key Bindings之间的比较。它将通过使组件可聚焦来显示您需要做什么来使KeyListener工作,尽管从来没有任何保证组件不会失去焦点。

答案 1 :(得分:0)

为所有切换案例添加break;。同时将方法paintComponent重命名为paint