2013-02-27 55 views
0

我正在繪製Java JPanel上的樓梯從(0,0)到座標(JComponent.getWidth(), JComponent.getHeight())
水平和垂直長度將保持不變,取決於常數NUM_STAIRS
最初的繪圖將是一條水平線。我猜這將使用while和if語句(可能嵌套),但我不知道如何生成此算法。使用Java繪製樓梯

我的思路:

版本1:
首先繪製的JComponent.getWidth()/NUM_STAIRS一個水平線,長時的y軸滿足
(y=n x JComponent.getHeight()/NUM_STAIRS, where 0< n<=NUM_STAIRS)的要求。
記住所繪製的線的端點的座標,繪製的JComponent.getHeight()/NUM_STAIRS
長度的垂直線,然後繪製在端點處的X下一水平行中的相同長度的座標
y = 1 x JComponent.getHeight()/NUM_STAIRS.
重複此動作,直到Y = JComponent的.getHeight()。

版本2:
做2路,分別畫出水平線和垂直線,想法會隨着版本1相似,但我感到困惑如何這個想法寫入一些代碼。

有人可以幫我嗎?謝謝。

回答

2

很可能有很多方法來實現這個...這個解決方案由一個舍入問題受苦,但這個概念將讓你感動...

enter image description here

的基本思想,是因爲你說,每一步的寬度和高度是可用空間的百分比。

每一步開始的步驟的寬度/高度和當前步驟的乘數的位置。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class StairWayToHeven { 

    public static void main(String[] args) { 
     new StairWayToHeven(); 
    } 

    public StairWayToHeven() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private int numSteps = 4; 

     public TestPane() { 
      setBorder(new EmptyBorder(4, 4, 4, 4)); 
      setLayout(new BorderLayout()); 

      final JSlider slider = new JSlider(2, 20); 
      slider.setOpaque(false); 
      slider.setValue(4); 
      add(slider, BorderLayout.SOUTH); 
      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        numSteps = slider.getValue(); 
        repaint(); 
       } 
      }); 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Insets insets = getInsets(); 
      int width = getWidth() - (insets.left + insets.right); 
      int height = getHeight() - (insets.top + insets.bottom); 

      int stepWidth = Math.round((float)width/(float)numSteps); 
      int stepHeight = Math.round((float)height/(float)numSteps); 

      g.setColor(Color.BLACK); 
      for (int step = 0; step < numSteps; step++) { 
       int fromX = insets.left + (stepWidth * step); 
       int fromY = insets.top + (stepHeight * step); 
       int toX = insets.left + (stepWidth * (step + 1)); 
       int toY = insets.top + (stepHeight * (step + 1)); 

       g.drawLine(fromX, fromY, toX, fromY); 
       g.drawLine(toX, fromY, toX, toY); 
      } 
     } 
    } 
} 
+0

謝謝你的解釋。 – hlx98007 2013-02-27 12:55:43