2013-03-04 151 views
1

問題是,條形圖下的文本與條形圖中的條不對齊。我如何使它們正確對齊?需要幫助修復GUI

爲了讓探測器閉嘴,我還可以補充些什麼細節? :)

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class SimpleBarChart extends JPanel { 

    private double[] value; 
    private String[] languages; 
    private String title; 
    private int gapBetweenBars = 40;//MODIFICATION - NOT A PART OF ORIGINAL CODE 

    public SimpleBarChart(double[] val, String[] lang, String t) { 
     languages = lang; 
     value = val; 
     title = t; 
    } 

    public void paintComponent(Graphics graphics) { 
     super.paintComponent(graphics); 
     if (value == null || value.length == 0) { 
      return; 
     } 
     double minValue = 0; 
     double maxValue = 0; 
     for (int i = 0; i < value.length; i++) { 
      if (minValue > value[i]) { 
       minValue = value[i]; 
      } 
      if (maxValue < value[i]) { 
       maxValue = value[i]; 
      } 
     } 
     Dimension dim = getSize(); 
     int clientWidth = dim.width; 
     int clientHeight = dim.height; 
     int barWidth = clientWidth/value.length; 

     barWidth = barWidth/3;//MODIFICATION - NOT A PART OF ORIGINAL CODE 

     Font titleFont = new Font("Book Antiqua", Font.BOLD, 15); 
     FontMetrics titleFontMetrics = graphics.getFontMetrics(titleFont); 
     Font labelFont = new Font("Book Antiqua", Font.PLAIN, 10); 
     FontMetrics labelFontMetrics = graphics.getFontMetrics(labelFont); 
     int titleWidth = titleFontMetrics.stringWidth(title); 
     int q = titleFontMetrics.getAscent(); 
     int p = (clientWidth - titleWidth)/2; 
     graphics.setFont(titleFont); 
     graphics.drawString(title, p, q); 
     int top = titleFontMetrics.getHeight(); 
     int bottom = labelFontMetrics.getHeight(); 

     if (maxValue == minValue) { 
      return; 
     } 

     double scale = (clientHeight - top - bottom)/(maxValue - minValue); 
     q = clientHeight - labelFontMetrics.getDescent(); 
     graphics.setFont(labelFont); 

     for (int j = 0; j < value.length; j++) { 
      int valueP = j * (barWidth + gapBetweenBars) + 1; //MODIFICATION - NOT A PART OF ORIGINAL CODE 
      int valueQ = top; 
      int height = (int) (value[j] * scale); 
      if (value[j] >= 0) { 
       valueQ += (int) ((maxValue - value[j]) * scale); 
      } else { 
       valueQ += (int) (maxValue * scale); 
       height = -height; 
      } 
      graphics.setColor(Color.blue); 
      graphics.fillRect(valueP, valueQ, barWidth - 2, height); 
      graphics.setColor(Color.black); 
      graphics.drawRect(valueP, valueQ, barWidth - 2, height); 
      int labelWidth = labelFontMetrics.stringWidth(languages[j]); 
      p = j * barWidth + (barWidth - labelWidth)/2; 
      graphics.drawString(languages[j], p, q); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(500, 500); 
     double[] value = new double[5]; 
     String[] languages = new String[5]; 
     value[0] = 1; 
     languages[0] = "Visual Basic"; 

     value[1] = 2; 
     languages[1] = "PHP"; 

     value[2] = 3; 
     languages[2] = "C++"; 

     value[3] = 4; 
     languages[3] = "C"; 

     value[4] = 5; 
     languages[4] = "Java"; 

     frame.getContentPane().add(new SimpleBarChart(value, languages, "Programming Languages")); 

     WindowListener winListener = new WindowAdapter() { 
      public void windowClosing(WindowEvent event) { 
       System.exit(0); 
      } 
     }; 
     frame.addWindowListener(winListener); 
     frame.setVisible(true); 
    } 

    public void setGapBetweenBars(int gapBetweenBars) { 

     this.gapBetweenBars = gapBetweenBars; 
    } 

    public int getGapBetweenBars() { 

     return this.gapBetweenBars; 
    } 
} 
+0

歡迎來到stackoverflow。您最近在您描述問題時發佈了一些問題,然後通過了一大段代碼。你應該嘗試發佈可能也會幫助其他人來到這裏的問題。像這樣的問題太局部化了。在提出問題以使其更有幫助之前,您應該嘗試縮小問題的範圍。 – Simon 2013-03-04 10:52:06

回答

3

p在for循環的價值是不正確的,而應是:

p = j * (barWidth + gapBetweenBars) + (barWidth - labelWidth)/2; 

你忘了考慮這個差距。

+1

哇!有用。你做了什麼,你是怎麼弄明白的? – SuperStar 2013-03-04 10:49:08

+1

@SuperStar你的字符串沒有水平對齊,這意味着'p'的值不正確。之後,它只是一個基本的數學運算:列索引/條時間(條寬+間隙)+(條寬/ 2)給出列的中間部分。然後,我們減去標籤大小的一半,以使其居中在條上。這就是全部;-) – 2013-03-04 10:51:41

+0

我這麼啞:(:( – SuperStar 2013-03-04 10:52:39

3

使用這方面的循環

int labelWidth = labelFontMetrics.stringWidth(languages[j]); 
p = j * (barWidth+gapBetweenBars) + (barWidth - labelWidth)/2; 

改變計算語言串之間的空間