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

GeneralPath无法基于计算坐标绘制线条问题求助

问题分析与解决方案

核心问题排查

你遇到的lineTo看似忽略计算坐标的问题,大概率不是GeneralPath的bug,而是以下两个常见原因:

  • 组件尺寸未正确设置
    你的Sketch继承自JPanel,但没有指定preferredSize。使用CardLayout时,布局管理器会根据组件的首选尺寸分配空间,默认JPanel的首选尺寸是(0,0)——即使你在paintComponent里绘制了260x220的背景,组件实际显示区域可能被压缩,导致计算出的坐标被裁剪,看起来像是没绘制出来。

  • 坐标计算验证缺失
    虽然公式逻辑正确,但你没有直观验证计算出的currentY是否在可见区域内,也没确认路径的实际形状。

修复步骤

步骤1:给Sketch设置首选尺寸

在Sketch的构造函数中添加尺寸设置,匹配你绘制的背景大小:

public Sketch(String num) {
    super();
    setPreferredSize(new Dimension(260, 220));
}

这能确保CardLayout为组件分配足够的显示空间,避免内容被裁剪。

步骤2:验证坐标位置(可选但推荐)

在paintComponent中添加代码,把路径的三个点画成小圆圈,直观确认它们的位置:

// 在comp2D.draw(trough)之后添加
comp2D.fillOval(minX.intValue()-2, minY.intValue()-2, 4,4);
comp2D.fillOval(110-2, currentY.intValue()-2,4,4);
comp2D.fillOval((maxX-15).intValue()-2, maxY.intValue()-2,4,4);

这样你能清楚看到三个点是否都在可见区域内,排除坐标超出范围的问题。

步骤3:替换为drawLine测试(可选)

如果怀疑GeneralPath的问题,可以暂时用drawLine直接绘制线段,验证坐标有效性:

// 替换原GeneralPath相关代码
comp2D.drawLine(minX.intValue(), minY.intValue(), 110, currentY.intValue());
comp2D.drawLine(110, currentY.intValue(), (maxX-15).intValue(), maxY.intValue());

如果这两条线能正常显示,说明GeneralPath的使用本身没有问题,还是布局尺寸的问题。

额外说明

你的坐标计算逻辑是正确的:r=157.5°的正切值为负,结合cLT的计算,最终得到的currentY≈108.67,这个坐标在260x220的背景范围内,理论上应该能正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:07:09