0

(0,0)座標から Java JPanel に階段を描いています(JComponent.getWidth(), JComponent.getHeight())
水平および垂直の長さは、定数に応じて同じままになりNUM_STAIRSます。
最初の描画は水平線になります。これは while ステートメントと if ステートメント (おそらくネストされている) を使用すると推測していますが、このアルゴリズムを作成する方法がわかりません。

私の考え:

バージョン 1:まず、y 軸が の要件を満たす場合、長さ
の水平線を描画します。 描画された線の終点座標を記憶し、長さ の垂直線を 描画してから、y=JComponent.getHeight() まで同じ長さの終点の x 座標に次の水平線を描画します 。このアクションを y=JComponent.getHeight() まで繰り返します。JComponent.getWidth()/NUM_STAIRS
(y=n x JComponent.getHeight()/NUM_STAIRS, where 0< n<=NUM_STAIRS)
JComponent.getHeight()/NUM_STAIRS

y = 1 x JComponent.getHeight()/NUM_STAIRS.

バージョン 2:
2 つのループを実行し、水平線と垂直線を別々に描画します。アイデアはバージョン 1 と似ています。

誰か助けてくれませんか?ありがとう。

4

1 に答える 1

2

これを達成する方法はおそらくたくさんあります...このソリューションは丸めの問題に悩まされていますが、コンセプトはあなたを動かします...

ここに画像の説明を入力してください

基本的な考え方は、あなたが言ったように、各ステップの幅と高さは利用可能なスペースのパーセンテージであるということです。

各ステップは、ステップの幅/高さと現在のステップの乗数である位置から始まります。

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);
            }
        }
    }
}
于 2013-02-27T04:12:03.423 に答える