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
相关产品推荐
相关产品推荐

