2013-02-27 102 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