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) {
}
}
# 1 楼答案
为所有开关案例添加
break;
。还将方法paintComponent
重命名为paint
# 2 楼答案
是否添加了调试代码以查看侦听器代码是否正在执行
KeyEvents被调度到具有焦点的组件。默认情况下,JComponent不可聚焦,因此该组件不会接收事件
更好的解决方案是使用
Key Bindings
。即使组件没有焦点,键绑定也可以工作有关更多信息,请阅读Swing教程中关于How to Use Key Bindings的部分
查看Motion Using the Keyboard以比较使用KeyListner和键绑定。它将显示通过使组件可聚焦来让KeyListener工作所需的操作,尽管无法保证组件不会失去焦点