2014-03-04 110 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

相關問題