You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:44:46