有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何通过KeyListener更改绘制?

您好,我希望通过单击向上箭头键将另一个故事添加到用paintComponent绘制的房屋中,并通过单击向下箭头键将其删除。但是我有关于KeyListener的问题,我不明白这个代码需要修复什么

导入javax。摆动JComponent; 导入javax。摆动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) 个答案

  1. # 1 楼答案

    为所有开关案例添加break;。还将方法paintComponent重命名为paint

  2. # 2 楼答案

    是否添加了调试代码以查看侦听器代码是否正在执行

    KeyEvents被调度到具有焦点的组件。默认情况下,JComponent不可聚焦,因此该组件不会接收事件

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

    有关更多信息,请阅读Swing教程中关于How to Use Key Bindings的部分

    查看Motion Using the Keyboard以比较使用KeyListner和键绑定。它将显示通过使组件可聚焦来让KeyListener工作所需的操作,尽管无法保证组件不会失去焦点