-2

我有一个功能程序,它通过每次鼠标单击来收集坐标,然后使用这些坐标绘制一个多边形。我添加了一个功能,这样当您完成绘制多边形并填充它时,您可以擦除屏幕并重新开始使用新形状。我遇到的麻烦是想办法重置坐标值。

我现在拥有的是在我的 actionPerformed 方法中,我将我的两个数组(XCoordinates 和 YCoordinates)清零。现在用户可以使用新坐标重新开始,但现在第一个坐标是 (0,0)。每次我画一个形状时,它都是从左上角开始的,哈哈。

我想将数组的值设置为初始化两个数组时最初的值。我尝试使用 actionPerformed 重新初始化数组,但它没有用,而且我确信这是非常糟糕的编程习惯。

有任何想法吗?

4

2 回答 2

2

直接操作坐标数组字段很诱人Polygon,但您只能通过公共 API 进行操作。特别是,看看这些方法:

  • invalidate(),“应该在对坐标进行任何直接操作后调用。”

  • reset(),这使多边形为空。

  • addPoint(),它保持内部一致的状态。

这里有一个相关的例子。

于 2012-11-02T02:21:55.980 回答
2

不提供任何代码会让您变得很困难,但这里有两个想法......

使用多边形

这基本上使用 aPolygon并不断向其添加点,直到您按 Enter 键...

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 回答