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

在Codename One中实现Y轴翻转(倒置)的正确代码方案

Codename One实现Y轴倒置绘图的正确代码

背景

在Java Swing中可以通过AffineTransform实现Y轴倒置(从下到上绘图),示例代码如下:

import javax.swing.*;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

public class InvertedYAxisSquare extends JPanel {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Inverted Y-Axis Square");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new InvertedYAxisSquare());
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setColor(Color.BLUE);
        AffineTransform at = new AffineTransform();
        at.scale(1, -1);
        at.translate(0, -getHeight());
        g2d.transform(at);
        g2d.fillRect(50, 0, 100, 111);
        g2d.dispose();
    }
}

但直接照搬变换逻辑到Codename One时会出现位置错误,原尝试代码如下:

@Override
public void paint(Graphics g) {
    super.paint(g);
    int height = getHeight();
    Transform t = Transform.makeIdentity();
    t.scale(1, -1);
    t.translate(0, -height);
    g.setTransform(t);
    g.setColor(0x0000ff);
    g.fillRect(50, 0, 100, 100);
    g.resetAffine();
}

正确实现代码

@Override
public void paint(Graphics g) {
    super.paint(g);
    int height = getHeight();
    Transform t = Transform.makeIdentity();
    // 先将原点平移到容器底部,再进行Y轴翻转
    t.translate(0, height);
    t.scale(1, -1);
    g.setTransform(t);
    g.setColor(0x0000ff);
    // 此时(50, 0)对应容器左下角位置,绘制的方块会从底部开始向上延伸
    g.fillRect(50, 0, 100, 100);
    g.resetAffine();
}

关键说明

Codename One的Transform变换应用顺序与Swing相反:

  • Swing中transform()方法是将新变换追加到现有变换链,执行顺序是先添加的先应用
  • Codename One中setTransform()是直接设置变换矩阵,变换方法(translate/scale)的调用顺序是后调用的先应用

因此正确的逻辑是先执行平移(将原点移到容器底部),再执行Y轴缩放翻转,这样才能让绘制的图形对应到预期的底部位置。

内容的提问来源于stack exchange,提问作者ilw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:13:27