Java bug?为什么绘制矩形而不是椭圆?

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个椭圆

而应该画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;
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);
    }
}