【问题标题】:Java 2d coordinate transformationJava 2d坐标变换
【发布时间】:2014-04-22 06:21:24
【问题描述】:

我正在尝试使用 java 2d 图形库绘制图形,我想我已经做到了。我想在坐标系中绘图,其中 0,0 位于左侧边缘面板的中心。我使用了以下代码,它似乎给了我需要的结果。

private void doDraw(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  AffineTransform saveAT = g2d.getTransform();
  // get the height of the panel
  int height = getHeight();
  // Find the middle of the panel
  double yTrans = ((double)height)/2.0;
  AffineTransform tform = AffineTransform.getTranslateInstance( 0.0, yTrans);
  g2d.setTransform(tform);
  //draw the line for the x-axis.
  g2d.drawLine(0,  0, 100, 0);
  //restore the old transform
  g2d.setTransform(saveAT);
}

这将原点绘制在窗口的中心。

当我添加一个菜单时问题就出现了。然后原点在 y 方向上偏移,大约是菜单大小的两倍。我需要考虑添加到面板的菜单和其他容器的大小吗?

private void doDraw(Graphics g) {
  Graphics2D g2d = (Graphics2D) g.create();

  int height = getHeight();
  double yTrans = ((double)height)/2.0;
  AffineTransform tform = AffineTransform.getTranslateInstance( 0.0, yTrans);
  g2d.transform(tform);
  //draw the line for the x-axis.
  g2d.drawLine(0,  0, 100, 0);
}

工作,谢谢你的帮助

【问题讨论】:

  • 您是说您观察到的是恢复旧转换不起作用,如果您注释掉最后一行,您仍然会看到相同的结果?
  • 否,当添加菜单然后没有菜单时,应该是原点的行在 JPanel 中更高。没有菜单,原点位于 JPanel 的中心。
  • 在你的paintComponent方法中,是不是调用了super方法,然后调用了这个私有的draw方法?另外,您可以只使用转换方法吗?要使用该方法,您可以从 g.Create() 创建一个新的 Graphics 对象,然后使用该新对象调用 transform,然后画线,并在其上调用 dispose。它只留下 Swing 其余部分使用的 Graphics 对象。
  • 很难从给定的代码中分辨出来。也许面板的getHeight() 由于添加了组件和周围的布局管理器而发生了变化?但是,我强烈建议您使用 JPanel 进行绘图和仅绘图。如果您有意在此JPanel 上放置其他组件,那么您应该尝试提供一个stackoverflow.com/help/mcve,以便更容易查看可能出现的问题。此外,“离题”,但从长远来看:考虑当你想在x=0.1 到x=0.2 范围内绘制一个函数时你会做什么。你必须概括这一点......
  • @Marco13,其他组件不在JPanel内,只是用于图形,问题是,当它们添加到父JPanel组件时,它会影响图形JPanel的大小和转换无法正常工作。

标签: java swing graphics2d


【解决方案1】:

您可以尝试here 概述的方法。覆盖paintComponent() 以获取相对于封闭面板而不是封闭框架的图形上下文。

要将原点居中在左边缘,请使用

g2d.translate(0, h / 2);

要获得直立的笛卡尔坐标,请使用

g2d.scale(1, -1);

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 2018-05-25
    • 2012-03-06
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多