2012-11-02 9 views
-2

У меня есть функциональная программа, которая собирает координаты с каждым щелчком мыши, а затем рисует многоугольник с использованием этих координат. Я добавил функцию, чтобы, когда вы закончите рисовать свой многоугольник, и он заполнен, вы можете стереть экран и начать снова с новой формы. У меня возникают проблемы с поиском способа сброса значений координат.Java Applet Polygon array

Что у меня сейчас есть в моем действииПереформированный метод I Нуль из моих двух массивов (XCoordinates и YCoordinates). Теперь пользователь может начать новый с новыми координатами, но теперь первая координата (0,0). Каждый раз, когда я рисую форму, он начинается в верхнем левом углу ха-ха.

Я хочу установить значения массива в значения, которые он имел, когда я изначально был, когда я инициализировал два массива. Я попытался выполнить RE-инициализацию массивов с помощью actionPerformed, но это не сработало, и я уверен, что это очень плохая практика программирования.

Любые идеи?

+0

Возможно, вы захотите показать некоторый код, чтобы ознакомиться с вашим описанием. Иначе, как нам узнать, что вы можете делать неправильно? –

+2

Один массив типа 'Point', является более объектно ориентированным, а затем параллельным массивом x-y. – Mordechai

+0

Я сам использовал бы 'ArrayList ' и затем вызывал бы 'clear()' для его сброса по желанию. –

ответ

2

Заманчиво манипулировать полями координатного массива Polygon, но вы должны сделать это только через открытый API. В частности, обратите внимание на эти методы:

  • invalidate(), который «должен быть вызван после любого прямого манипулирования координат.»

  • reset(), что делает полигон пустым.

  • addPoint(), который поддерживает внутренне согласованное состояние.

Существует связанный пример here.

2

Вы затрудняя, ​​не предоставляя никакого кода, но вот два берет на идее ...

Использование Polygon

Это в основном использует Polygon и не продолжает добавлять точки к нему до тех пор, вы нажимаете ввести ...

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 объект каждый раз, когда он делает перерисовку.

+0

+1 для контраста. – trashgod