【发布时间】: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