如何在Swing中通过KeyListener仅让矩形旋转一次
解决Swing矩形旋转与下移冲突的问题
嘿,我来帮你搞定这个问题!你现在遇到的核心问题是:每次按下按键都会触发矩形宽高切换,导致第一次按转过来,再按又转回去,同时还往下移,完全不符合“只旋转一次,之后仅下移”的需求。
解决方案思路
我们只需要加一个状态标志位来记录矩形是否已经完成旋转,通过这个标志来控制旋转操作只执行一次:
- 新增一个布尔类型的成员变量,标记旋转状态
- 在按键事件中,先判断标志位:未旋转时才执行宽高切换,之后把标志设为已旋转
- 无论是否旋转,每次按键都执行下移操作
修改后的代码示例
假设你的类继承自JPanel,完整的关键代码如下:
import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; public class RotateRectPanel extends JPanel { private int x = 50; // 矩形初始x坐标 private int y = 50; // 矩形初始y坐标 private int width = 100; // 初始宽度 private int height = 50; // 初始高度 private boolean isRotated = false; // 核心:标记矩形是否已旋转 public RotateRectPanel() { setFocusable(true); // 必须设置焦点才能接收键盘事件 addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_DOWN) { // 假设按下向下键触发操作 if (!isRotated) { // 仅第一次按键时切换宽高(旋转) int temp = width; width = height; height = temp; isRotated = true; // 标记为已旋转,后续不再执行旋转 } // 每次按键都执行下移 y += 10; repaint(); // 重绘界面更新矩形状态 } } }); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.BLACK); g.drawRect(x, y, width, height); // 绘制当前状态的矩形 } public static void main(String[] args) { JFrame frame = new JFrame("Rotate Rect Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new RotateRectPanel()); frame.setSize(400, 400); frame.setVisible(true); } }
关键逻辑解释
isRotated变量初始为false,表示矩形未旋转- 第一次按下向下键时,
!isRotated为true,执行宽高切换,同时把isRotated设为true - 后续再按下向下键时,
!isRotated为false,跳过旋转操作,只执行下移 repaint()方法会触发paintComponent重绘,让界面实时更新矩形的位置和大小
这样就能完美实现你想要的效果:第一次按键旋转+下移,之后仅下移~
内容的提问来源于stack exchange,提问作者Cheeseu
相关产品推荐
相关产品推荐

