Java drawOval的意外行为

Java drawOval的意外行为,java,swing,java-2d,Java,Swing,Java 2d,我面临drawOval函数的问题。我用它画圆,但结果看起来不像一个圆。 我认为这种行为发生在Jpanel达到一定高度后。 向下滚动到最后,您可以得到如下图所示的结果。 有人能解释一下吗 将面板尺寸更改为更合理的尺寸,例如:1000,它将正常工作。将面板尺寸更改为更合理的尺寸,例如:1000,它将正常工作。设置首选尺寸(新尺寸(1960,77660240))。您希望77660240号码会发生什么情况?这比我现在的屏幕高出7万倍!那么使用JScrollPane有什么好处呢?滚动窗格用于说明大于可

我面临drawOval函数的问题。我用它画圆,但结果看起来不像一个圆。 我认为这种行为发生在Jpanel达到一定高度后。 向下滚动到最后,您可以得到如下图所示的结果。 有人能解释一下吗


将面板尺寸更改为更合理的尺寸,例如:1000,它将正常工作。

将面板尺寸更改为更合理的尺寸,例如:1000,它将正常工作。

设置首选尺寸(新尺寸(1960,77660240))。您希望77660240号码会发生什么情况?这比我现在的屏幕高出7万倍!那么使用JScrollPane有什么好处呢?滚动窗格用于说明大于可用显示空间的组件。但不是那些比可用空间大得离谱的组件。例如,想想滑杆的事情。它会缩放,以便较长的对象将生成较小的滑块。但在70000倍的差异下,滑块“逻辑上”是。。只有一个像素高!还有一个问题是JRE是否有足够的内存来处理如此大的对象。如果我知道这样做的最终目的,我也许能够提出更好的策略。奇怪的是,对我来说,变形开始出现在大约
(2^31-1)/64
。不确定它是否有任何意义。
setPreferredSize(新维度(1960,77660240))。您希望77660240号码会发生什么情况?这比我现在的屏幕高出7万倍!那么使用JScrollPane有什么好处呢?滚动窗格用于说明大于可用显示空间的组件。但不是那些比可用空间大得离谱的组件。例如,想想滑杆的事情。它会缩放,以便较长的对象将生成较小的滑块。但在70000倍的差异下,滑块“逻辑上”是。。只有一个像素高!还有一个问题是JRE是否有足够的内存来处理如此大的对象。如果我知道这样做的最终目的,我也许能够提出更好的策略。奇怪的是,对我来说,变形开始出现在大约
(2^31-1)/64
。不知道它是否意味着什么。但是为什么它对drawRect正确工作,并且大小没有限制。不知道为什么,但是这样的大小肯定是绝对不合理的。我试过7000000,它可以工作,但即使是那个尺寸也不现实…但为什么它对drawRect正确工作,并且没有大小限制。不知道为什么,但这样的尺寸肯定是绝对不合理的。我试着用7000000,效果不错,但即使是这样的尺寸也不现实。。。
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class TestMain
{
    public static void main(String[] args)
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane jsp = new JScrollPane();
        jsp.setViewportView(new TestPanel());
        f.getContentPane().add(jsp);
        f.setSize(500,400);
        f.setLocation(200,200);
        f.setVisible(true);
    }
}

class TestPanel extends JPanel
{
    public TestPanel()
    {
        setPreferredSize(new Dimension(1960 , 77660240));
        setBackground(Color.white);
    }

    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawRect(30, 77660141, 100, 20);
        g2.drawOval(15, 77660141, 10, 10);
        g2.draw(new Ellipse2D.Double(140, 77660141,
                             10,
                             10));
        g2.draw(new Ellipse2D.Double(160, 77660141,
                             10,
                             10));
        g2.draw(new Ellipse2D.Double(180, 77660141,
                             10,
                             10));
        g2.draw(new Ellipse2D.Double(200, 77660141,
                             30,
                             30));
    }
}