Java bug?为什么绘制矩形而不是椭圆?
下面的代码绘制了矩形和2个椭圆 而应该画3个椭圆 我的操作系统是Windows 7 prof 64位 我的Java是1.6x86,也测试了1.7x64 为什么?Java bug?为什么绘制矩形而不是椭圆?,java,swing,scale,java-2d,Java,Swing,Scale,Java 2d,下面的代码绘制了矩形和2个椭圆 而应该画3个椭圆 我的操作系统是Windows 7 prof 64位 我的Java是1.6x86,也测试了1.7x64 为什么? 我复制/粘贴了你的代码,它画出了你写的2个省略号,我唯一做的更改是将你的MigLayout替换为null,手动设置框架和面板尺寸,并删除frame.pack()调用: import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; i
我复制/粘贴了你的代码,它画出了你写的2个省略号,我唯一做的更改是将你的
MigLayout
替换为null
,手动设置框架和面板尺寸,并删除frame.pack()
调用:
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
JPanel circlePanel = new JPanel() {
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(1));
//g2d.drawOval(0, 0, 200, 200);
g2d.draw(new Ellipse2D.Double(0, 0, 200, 200));
AffineTransform old = g2d.getTransform();
g2d.scale(10000, 10000);
g2d.setStroke(new BasicStroke(0.001f));
g2d.draw(new Ellipse2D.Double(0, 0, 0.025, 0.025));
g2d.setTransform(old);
}
};
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
circlePanel.setBounds(new Rectangle(0, 0, 300, 300));
frame.add(circlePanel);
frame.setBounds(0, 0, 350, 300);
//frame.pack();
frame.setVisible(true);
}
}
更新:
可能会使用Oracle JDK(java版本“1.8.0-ea”)而不是OpenJDK重现问题。得到钻石形状,正如在另一个答案中指出的,比例因子是形状退化的根本原因,但不知道这是否应该是合适的行为,因此,这些JRE中一定有一个缺陷。
以下测试程序适用于两种JRE:
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
JPanel circlePanel = new JPanel() {
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(1));
//g2d.drawOval(0, 0, 200, 200);
g2d.draw(new Ellipse2D.Double(0, 0, 200, 200));
AffineTransform old = g2d.getTransform();
g2d.scale(10, 10);
g2d.setStroke(new BasicStroke(1.0f));
g2d.draw(new Ellipse2D.Double(0, 0, 25.0, 25.0));
g2d.setTransform(old);
}
};
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
circlePanel.setBounds(new Rectangle(0, 0, 300, 300));
frame.add(circlePanel);
frame.setBounds(0, 0, 350, 300);
//frame.pack();
frame.setVisible(true);
}
}
在Java 7和Eclipse中的Windows 7上复制,删除布局管理器 我的感觉是,这是由于小浮点值的高缩放和不精确性的结合,减少了生成的点数 如果替换0.0363和0.0362之间的值,渲染API将中断。它不再生成圆弧,而是生成正方形
解决方法是停止将巨大的缩放比例与微小的对象相结合。缩小并增加大小。要更快获得更好的帮助,请发布.1)
g2d.Scale(10000)代码>为什么会有如此大的扩展?2) new JPanel(){@Override public void paint(Graphics g)
应该是new JPanel(){@Override public void paintComponent(Graphics g)
3)该方法的第一行通常应该调用super
例如super.paintComponent(g)
@Andrew(1)对于测试(2,3),没有帮助“用NullLayout
替换您的migloayout
”1)没有该字符串所建议的NullLayout
类。2)面板应返回首选大小,以便布局管理器使用维度。对不起,我的错误,事实上,我的意思是仅用null
替换MigLayout
,在answer@h3nr1x你有什么操作系统和Java?我有同样的results使用1.6.0(另一个编译后)和1.7.0_09(只使用您的代码)中的两个代码,一个正方形而不是椭圆
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
JPanel circlePanel = new JPanel() {
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(1));
//g2d.drawOval(0, 0, 200, 200);
g2d.draw(new Ellipse2D.Double(0, 0, 200, 200));
AffineTransform old = g2d.getTransform();
g2d.scale(10, 10);
g2d.setStroke(new BasicStroke(1.0f));
g2d.draw(new Ellipse2D.Double(0, 0, 25.0, 25.0));
g2d.setTransform(old);
}
};
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
circlePanel.setBounds(new Rectangle(0, 0, 300, 300));
frame.add(circlePanel);
frame.setBounds(0, 0, 350, 300);
//frame.pack();
frame.setVisible(true);
}
}