2014-03-06 15 views
0

我在Java applet中創建了一個圖形,並試圖讓g.fillRect使用屏幕自動調整。我希望第一個酒吧成爲屏幕的三分之一,然後將每個酒吧的面積減半。獲取圖形以自動調整屏幕

g.fillRect(xpos, 550, width, hight); 

我似乎有一個與每個酒吧之間的差距問題。你能幫我解決這個問題嗎?提前致謝。

+0

你恰好有3間酒吧談論條形圖? – Marco13

+0

酒吧的數量最多可以變化28. – Joe

回答

1

你必須計算每個單獨的杆,這是的寬度

barWidth = availableWidth/numberOfBars - 1 

「-1」,將將要留下的條之間,並且因此,必須再次在添加空間計算實際座標。你可以花一些時間細節:當這些數字不是「很好可分的」時,那麼這些條紋必須有不同的寬度,或者你必須在左側和右側添加一個小的邊距來補償奇數尺寸。

然而,這裏是一個可能的解決方案速寫:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class BarChart 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.getContentPane().setLayout(new BorderLayout()); 

     final JSlider slider = new JSlider(1, 50, 3); 
     final BarChartPanel barChartPanel = new BarChartPanel(); 
     slider.addChangeListener(new ChangeListener() 
     { 
      @Override 
      public void stateChanged(ChangeEvent e) 
      { 
       barChartPanel.setNumberOfBars(slider.getValue()); 
      } 
     }); 

     f.getContentPane().add(slider, BorderLayout.NORTH); 
     f.getContentPane().add(barChartPanel, BorderLayout.CENTER); 

     f.pack(); 
     f.setSize(600,600); 
     f.setVisible(true); 
    } 
} 


class BarChartPanel extends JPanel 
{ 
    private int numberOfBars = 3; 

    void setNumberOfBars(int n) 
    { 
     this.numberOfBars = n; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     Random random = new Random(0); 
     int barWidth = getWidth()/numberOfBars - 1; 
     int barsWidth = numberOfBars * (barWidth+1); 
     int offsetX = (getWidth() - barsWidth)/2; 
     for (int b=0; b<numberOfBars; b++) 
     { 
      int x = offsetX + b * (barWidth + 1); 
      int barHeight = random.nextInt(500); 
      int y = getHeight() - barHeight; 
      g.fillRect(x, y, barWidth, barHeight); 
     } 
    } 
} 
+0

感謝您的快速回復,我試圖將代碼實現到程序中,但它沒有達到預期的效果。這絕對是在我身邊。我會繼續嘗試,看看我能否得到它的工作。 – Joe