我正在尝试创建一个程序,使用参数方程,可以在线之间绘制线条并创建椭圆。这是我的代码:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JFrame;
public class test extends JFrame{
ArrayList<Line2D> lines = new ArrayList<>();
public test(){
this.setTitle("test");
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawCircle(3,3.0,3.0);
this.setVisible(true);
System.out.println(lines.size());
}
public void drawCircle(int radio, double xCenter, double yCenter) {
double t = 0;
double xPoint;
double yPoint;
double xActual = xCenter;
double yActual = yCenter + radio*Math.sin(0);
t += 0.01;
while(t < 360) {
xPoint = xCenter + radio*Math.cos(t);
yPoint = yCenter + radio*Math.sin(t);
lines.add(new Line2D.Double(xActual, yActual, xPoint, yPoint));
this.repaint();
t += 0.01;
xActual = xPoint;
yActual = yPoint;
}
}
public void paint(Graphics g) {
super.paint(g);
for(Line2D s : lines){
((Graphics2D) g).draw(s);
}
}
}
我没有收到任何错误,但这些线条似乎没有出现在框架中。我做错了什么?
答案 0 :(得分:2)
在所有情况下,在paintComponent(Graphics)
中完成绘图,而不是article中描述的paint
。我建议你使用JPanel
或任何其他非物质组件进行绘画 - 这是常见的习惯。
并且
...
lines.add(new Line2D.Double(xActual, yActual, xPoint, yPoint));
this.repaint();
...
这种重复调用会导致一些非常丑陋的行为,并且相当浪费资源(每增加一个形状36000个无用的重绘)。
答案 1 :(得分:2)
欢迎来到这个奇妙的世界,为什么你不应该从JFrame
延伸,以及为什么你不应该覆盖paint
等顶级容器JFrame
主要问题是,框架有边框。如果您覆盖paint
的{{1}}并在JFrame
绘画,则实际上您将在框架下绘画。你的圆圈(比例为3)足够小,可以完全涂在窗口的标题栏下。
有关此问题的示例以及您不应覆盖0x0
顶级容器的原因,请参阅How to get the EXACT middle of a screen, even when re-sized,How can I set in the midst?和Java AWT drawString() does not display on window
相反,请使用paint
之类的组件并覆盖它JPanel
并将自定义绘画放在那里。然后将其放在paintComponent
的实例中,例如......
JFrame
你的下一个问题是,import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
public Test() throws HeadlessException {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Test");
frame.add(new TestPane());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
ArrayList<Line2D> lines = new ArrayList<>();
public TestPane() {
drawCircle(3, 3.0, 3.0);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
System.out.println(lines.size());
for (Line2D s : lines) {
g2d.draw(s);
}
g2d.dispose();
}
public void drawCircle(int radio, double xCenter, double yCenter) {
double t = 0;
double xPoint;
double yPoint;
double xActual = xCenter;
double yActual = yCenter + radio * Math.sin(0);
t += 0.01;
while (t < 360) {
xPoint = xCenter + radio * Math.cos(t);
yPoint = yCenter + radio * Math.sin(t);
// System.out.println(xActual + "x" + yActual + "x" + xPoint + "x" + yPoint);
lines.add(new Line2D.Double(xActual, yActual, xPoint, yPoint));
t += 0.01;
xActual = xPoint;
yActual = yPoint;
}
}
}
}
(或足够接近它)是圆圈的中心点。生成形状时,您需要能够计算0x0
/ x
偏移量,以便圆圈的左上角位于y
而不是
例如,在测试代码时,我将0x0
增加到radio
(看看它是否有所不同,这就是我发现你在框架下绘画的方式)并生成类似......
答案 2 :(得分:0)
创建Graphics2D对象。它有助于。例如:
Graphics2D g2 = (Graphics2D)g;
一旦你有了,你需要设置颜色。你没做的。例如:
g2.setColor(Color.BLACK);
也只是一个提示,覆盖paintComponent(Graphics g)并且不要覆盖paint()。