使用Java绘制楼梯

使用Java绘制楼梯,java,Java,我正在Java JPanel上绘制一个从(0,0)到坐标(JComponent.getWidth(),JComponent.getHeight()) 水平和垂直长度将保持不变,这取决于恒定的NUM_楼梯 初始图纸将是一条水平线。我猜这将使用while和if语句(可能是嵌套的),但我不确定如何生成此算法 我的想法是: 第1版: 当y轴满足要求时,首先画一条长度为JComponent.getWidth()/NUM_STAIRS的水平线 (y=n x JComponent.getHeight()/NU

我正在Java JPanel上绘制一个从
(0,0)
到坐标
(JComponent.getWidth(),JComponent.getHeight())

水平和垂直长度将保持不变,这取决于恒定的
NUM_楼梯

初始图纸将是一条水平线。我猜这将使用while和if语句(可能是嵌套的),但我不确定如何生成此算法

我的想法是:

第1版:
当y轴满足要求时,首先画一条长度为
JComponent.getWidth()/NUM_STAIRS
的水平线

(y=n x JComponent.getHeight()/NUM_STAIRS,其中0

正如你所说,基本思想是,每一步的宽度和高度都是可用空间的百分比

每一步从一个位置开始,该位置是该步的宽度/高度和当前步的倍增

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);
            }
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Insets;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JSlider;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.EmptyBorder;
导入javax.swing.event.ChangeEvent;
导入javax.swing.event.ChangeListener;
通往海文的公共级楼梯{
公共静态void main(字符串[]args){
通往赫文的新楼梯();
}
通往赫文的公共楼梯(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
私有int numSteps=4;
公共测试窗格(){
新订单(新的空订单(4,4,4,4));
setLayout(新的BorderLayout());
最终JSlider滑块=新JSlider(2,20);
slider.set不透明(false);
滑块。设置值(4);
添加(滑块,BorderLayout.SOUTH);
slider.addChangeListener(新的ChangeListener(){
@凌驾
公共无效状态已更改(更改事件e){
numSteps=slider.getValue();
重新油漆();
}
});
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Insets Insets=getInsets();
int width=getWidth()-(insets.left+insets.right);
int height=getHeight()-(insets.top+insets.bottom);
int stepWidth=数学圆((浮点)宽度/(浮点)numSteps);
int stepHeight=数学圆((浮动)高度/(浮动)微步);
g、 设置颜色(颜色为黑色);
对于(int step=0;step
谢谢您的解释。