【发布时间】:2014-01-10 01:43:17
【问题描述】:
我正在制作一个简单的程序来绘制图形和其中的一些点。这些点应该在更改g.fillOval 的坐标时使用方法制作,但实际上它只绘制最后一个点。
代码如下:
import javax.swing.*;
import java.awt.*;
public class PointGraphWriter extends JPanel
{
JFrame korniza = new JFrame();
private int x;
private int y;
private int length;
private String OX;
private String OY;
private String emri;
private int y_height;
private int x_num;
public PointGraphWriter()
{
int width= 500;
korniza.setSize(width,width);
korniza.setVisible(true);
korniza.setTitle(emri);
korniza.getContentPane().add(this);
}
public void paintComponent(Graphics g)
{
g.drawLine(x,y,x+length,y);
g.drawLine(x,y,x,y-length);
g.drawString(OX,x+length, y+15);
g.drawString(OY,x-15,y-length);
g.drawString("0", x -15,y);
g.drawString("0", x,y+15);
g.fillOval(x_num,y-y_height-2, 4 ,4);
}
public void setTitle(String name)
{
emri= name;
this.repaint();
}
public void setAxes(int x_pos, int y_pos, int axis_length, String x_label, String y_label)
{
x= x_pos;
y=y_pos;
length= axis_length;
OX = x_label;
OY = y_label;
}
public void setPoint1(int height)
{
y_height=height;
x_num = x-2;
this.repaint();
}
public void setPoint2(int height)
{
y_height=height;
x_num = x + length/5-2;
this.repaint();
}
}
这里是主要方法:
public class TestPlot
{
public static void main(String[] a)
{
PointGraphWriter e = new PointGraphWriter();
e.setTitle("Graph of y = x*x");
e.setAxes(50, 110, 90, "5", "30");
int scale_factor = 3;
e.setPoint1(0 * scale_factor);
e.setPoint2(1 * scale_factor);
}
}
【问题讨论】:
-
您需要在一些
Collections中保存坐标 并在Collection上迭代以每次绘制所有点(一个新点添加到前一个列表) -
嗯,我实际上是一个初学者,不知道该怎么做。我只是把这个练习作为我学校的一个项目。 img856.imageshack.us/img856/8932/9n1b.png 这是练习。目前我只使用了 setPoint1 和 setPoint 2 但我无法解决这个问题。
-
你可以看看这个thread。恐怕,我不能为你做作业。虽然一个小例子很快就会出现......,如果你仍然不清楚这个想法:-)
-
是的,我只是认为我可以只使用 repaint() 来完成那里的工作,但它似乎不起作用。还是谢谢
-
Swing 组件不能从事件分派线程的任何其他线程中使用。将 main 方法的代码包装在 SwingUtilities.invokeLater() 调用中,一切都会好起来的。 docs.oracle.com/javase/tutorial/uiswing/concurrency/…