gpt4 book ai didi

Java错误?为什么画矩形而不是椭圆?

转载 作者:搜寻专家 更新时间:2023-11-01 03:09:13 25 4
gpt4 key购买 nike

下面的代码绘制矩形和 2 个椭圆。

enter image description here

虽然应该画3个椭圆。

我的操作系统是 Windows 7 prof 64 位

我的 Java 是 1.6 x86 也经过 1.7 x64 测试。

为什么?

package tests;

import java.awt.BasicStroke;
import java.awt.Color;
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;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class AntialiacingScaleTester {

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {

JPanel circlePanel = new JPanel() {
@Override
public void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(Color.RED);
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.setColor(Color.GREEN);
g2d.scale(1000, 1000);
g2d.setStroke(new BasicStroke(0.001f));
g2d.draw(new Ellipse2D.Double(0, 0, 0.225, 0.225));

g2d.setColor(Color.BLUE);
g2d.scale(10, 10);
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(new MigLayout("fill"));
//frame.add(circlePanel, "w 300, h 300, grow");

//frame.add(circlePanel);

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);

}
});

}

}

最佳答案

我复制/粘贴了你的代码,它画出了你写的 2 个椭圆,我做的唯一改变是用 null 替换你的 MigLayout,设置框架和手动面板尺寸并删除 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);
}
}

enter image description here

更新:可以使用 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错误?为什么画矩形而不是椭圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com