我从http://www.java-forums.org/new-java/7995-how-plot-graph-java-given-samples.html找到了以下代码。
我不明白为什么w = getWidth()和h = getHeight()不相等。以及如何使它们彼此相等?
由于
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class GraphingData extends JPanel {
int[] data = {
21, 14, 18, 03, 86, 88, 74, 87, 54, 77,
61, 55, 48, 60, 49, 36, 38, 27, 20, 18
};
final int PAD = 20;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
// Draw ordinate.
g2.draw(new Line2D.Double(PAD, PAD, PAD, h-PAD));
// Draw abcissa.
g2.draw(new Line2D.Double(PAD, h-PAD, w-PAD, h-PAD));
double xInc = (double)(w - 2*PAD)/(data.length-1);
double scale = (double)(h - 2*PAD)/getMax();
// Mark data points.
g2.setPaint(Color.red);
for(int i = 0; i < data.length; i++) {
double x = PAD + i*xInc;
double y = h - PAD - scale*data[i];
g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
}
}
private int getMax() {
int max = -Integer.MAX_VALUE;
for(int i = 0; i < data.length; i++) {
if(data[i] > max)
max = data[i];
}
return max;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new GraphingData());
f.setSize(400,400);
f.setLocation(200,200);
f.setVisible(true);
}
}
答案 0 :(得分:2)
您似乎假设框架的大小是可查看内容区域的大小。
框架由内容和框架装饰组成。所以在我的系统上,一个400x400的帧,导致内容可视区域为384x362
你应该做的第一件事是摆脱f.setSize()
,它是不可靠的,因为它创建的可视内容区域对于你的程序运行的每个系统都是不同的。相反,您应该使用f.pack()
,它使用帧内容来确定窗口的大小(以便可视内容区域优先)。
接下来,在GraphingData
课程中,您需要覆盖getPreferredSize
并返回您要使用的面板的首选大小。
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
这将允许(某些)布局管理员更好地决定如何最好地展示您的组件。