2014-03-04 67 views
0

我从http://www.java-forums.org/new-java/7995-how-plot-graph-java-given-samples.html发现以下代码。如何获得JPanel相等的宽度和高度

我不明白为什么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); 
} 
} 

回答

2

你似乎是假设帧的大小是可视内容区域的大小下。

一个框架由内容和框架装饰组成。所以,我的系统中,400×400的框架,对造成的384x362

Frame Size

你应该做的是摆脱f.setSize()的第一件事内容可视区域,这是不可靠的,因为它创造意志可视内容区域对于程序运行的每个系统而言都不相同。相反,您应该使用f.pack(),它使用帧内容来确定窗口的大小(以便优先查看可见内容区域)。

接下来,在您的GraphingData类中,您将需要覆盖getPreferredSize并返回您希望使用的面板的首选大小。

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(400, 400); 
} 

这将允许(一些)布局管理者更好地决定如何最好地呈现组件。

+0

谢谢。有用 – Liu

相关问题