-2

マウスをクリックするたびに座標を収集し、それらの座標を使用してポリゴンを描画する関数型プログラムがあります。ポリゴンの描画が完了し、ポリゴンが塗りつぶされたら、画面を消去して新しい形状でやり直すことができるようにする機能を追加しました。私が問題を抱えているのは、座標値をリセットする方法を考え出すことです。

私が今持っているのは、私のactionPerformedメソッド内にあります。2つの配列(XCoordinatesとYCoordinates)をゼロにします。これで、ユーザーは新しい座標で最初からやり直すことができますが、最初の座標は(0,0)になります。図形を描くたびに、左上隅から始まります。

配列の値を、2つの配列を初期化したときに最初に持っていた値に設定したいと思います。actionPerformedを使用して配列を再初期化しようとしましたが、機能しませんでした。これは非常に悪いプログラミング手法であると確信しています。

何か案は?

4

2 に答える 2

2

座標配列フィールドを直接操作したくPolygonなるかもしれませんが、パブリック API を介してのみ行う必要があります。特に、次のメソッドを見てください。

  • invalidate()、「座標を直接操作した後に呼び出す必要があります」。

  • reset()、ポリゴンを空にします。

  • addPoint()、内部的に一貫した状態を維持します。

ここに関連する例があります。

于 2012-11-02T02:21:55.980 に答える
2

コードを提供しないことで難しくなっていますが、ここに 2 つのアイデアがあります...

ポリゴンを使用

これは基本的に a を使用し、PolygonEnter キーを押すまでポイントを追加し続けます...

public class PolyPainter {

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

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

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PolyPane());
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class PolyPane extends JPanel {

        private Polygon poly;
        private Point lastPoint;

        public PolyPane() {

            poly = new Polygon();

            InputMap im = getInputMap();
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "clear");
            ActionMap am = getActionMap();
            am.put("clear", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    poly = new Polygon();
                    repaint();
                }
            });

            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    lastPoint = e.getPoint();
                    poly.addPoint(e.getX(), e.getY());
                    repaint();
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.draw(poly);
            if (lastPoint != null) {
                g2d.setColor(Color.RED);
                g2d.fillOval(lastPoint.x - 5, lastPoint.y - 5, 10, 10);
            }
            g2d.dispose();
        }
    }
}

ポイントのリストを使用

これは基本的にポイントのリストを使用します

public class PolyPainter1 {

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

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

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PolyPane());
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class PolyPane extends JPanel {

        private List<Point> poly;
        private Point lastPoint;

        public PolyPane() {

            poly = new ArrayList<Point>(25);

            InputMap im = getInputMap();
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "clear");
            ActionMap am = getActionMap();
            am.put("clear", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    poly.clear();
                    repaint();
                }
            });

            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    lastPoint = e.getPoint();
                    poly.add(lastPoint);
                    repaint();
                }
            });

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            Graphics2D g2d = (Graphics2D) g.create();
            Polygon pg = new Polygon();
            for (Point p : poly) {
                pg.addPoint(p.x, p.y);
            }
            g2d.draw(pg);
            if (lastPoint != null) {
                g2d.setColor(Color.RED);
                g2d.fillOval(lastPoint.x - 5, lastPoint.y - 5, 10, 10);
            }
            g2d.dispose();
        }
    }
}

Polygon個人的には、再描画を行うたびに新しいオブジェクトを構築する必要がないため、最初のものの方が効率的です。

于 2012-11-02T03:17:09.463 に答える