您好我希望通过单击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) {
}
}
答案 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