2013-02-27 2 views
0

Je dessine un escalier sur Java JPanel de (0,0) à la coordonnée (JComponent.getWidth(), JComponent.getHeight()). La longueur horizontale et verticale restera la même dépend de la constante NUM_STAIRS.
Le dessin initial sera une ligne horizontale. Je suppose que cela utilisera des instructions while et if (probablement imbriquées) mais je ne suis pas sûr de savoir comment produire cet algorithme.Dessiner un escalier en utilisant Java

Ma pensée:

Version 1:
dessiner d'abord une ligne horizontale de JComponent.getWidth()/NUM_STAIRS longueur lorsque l'axe y répond à l'exigence de
(y=n x JComponent.getHeight()/NUM_STAIRS, where 0< n<=NUM_STAIRS).
souvenir de l'extrémité coordonnées de la ligne tracée, tracer la ligne verticale de JComponent.getHeight()/NUM_STAIRS
en longueur, puis tracer la ligne horizontale suivante au x du point d'extrémité de coordonnées de la même longueur à
y = 1 x JComponent.getHeight()/NUM_STAIRS.
Répéter cette action jusqu'à ce que y = JComponent .getHeight(). Faire 2 boucles, dessiner les lignes horizontales et les lignes verticales séparément, l'idée sera similaire à la version 1. Mais je suis confus sur la façon d'écrire cette idée dans du code.

Quelqu'un pourrait m'aider s'il vous plaît? Merci.

Répondre

2

Il y a probablement beaucoup de moyens pour y parvenir ... ces solutions souffre d'un problème d'arrondi, mais le concept va vous faire bouger ...

enter image description here

L'idée de base, est que vous dit, que la largeur et la hauteur de chaque étape est un pourcentage de l'espace disponible.

Chaque étape commence à la position qui est le multiplicateur de la largeur/hauteur du pas et de l'étape en cours.

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

Merci pour l'interprétation. – hlx98007

Questions connexes