2015-07-01 4 views
0

У меня есть список массивов, который отслеживает «точки» и я использую массив для отслеживания разных размеров. Размер изменяется с помощью mouseWheelListener, и изменение сохраняется в этом массиве. Однако по какой-то причине ВСЕ из точек изменяются, что не то, что я хочу. Пройдя через него, несколько раз все выглядит так, как будто он должен работать, но я должен пропустить что-то простое. Мой код выглядит следующим образом.Создание приложения «paint» в Java

//******************************************************************** 
// DotsPanel.java   
// Represents the primary panel for the Dots program. 
//******************************************************************** 

import java.util.ArrayList; 

import javax.swing.JPanel; 

import java.awt.*; 
import java.awt.event.*; 

public class DotsPanel extends JPanel 
{ 
    private int SIZE = 10; // radius of each dot 
    private int[] dotSizes = new int[10000]; 
    int i = 0; 

    private ArrayList<Point> pointList; 

    //----------------------------------------------------------------- 
    // Constructor: Sets up this panel to listen for mouse events. 
    //----------------------------------------------------------------- 
    public DotsPanel() 
    { 
     pointList = new ArrayList<Point>(); 

     addMouseListener (new DotsListener()); 
     addMouseMotionListener(new DotsListener()); 
     addMouseWheelListener(new DotsListener()); 

     setBackground(Color.red); 
     setPreferredSize(new Dimension(300, 200)); 
    } 

    //----------------------------------------------------------------- 
    // Draws all of the dots stored in the list. 
    //----------------------------------------------------------------- 
    public void paintComponent(Graphics page) 
    { 
     super.paintComponent(page); 

     page.setColor(Color.cyan); 

     for (Point spot : pointList) 
      //change size to sizes[n] 
      page.fillOval(spot.x-dotSizes[pointList.size()-1], spot.y-dotSizes[pointList.size()-1], dotSizes[pointList.size()-1]*2, dotSizes[pointList.size()-1]*2); 

     page.drawString("Count: " + pointList.size(), 5, 15); 
    } 

    //***************************************************************** 
    // Represents the listener for mouse events. 
    //***************************************************************** 
    private class DotsListener implements MouseListener, MouseMotionListener, MouseWheelListener 
    { 
     //-------------------------------------------------------------- 
     // Adds the current point to the list of points and redraws 
     // the panel whenever the mouse button is pressed. 
     //-------------------------------------------------------------- 
     public void mousePressed(MouseEvent event) 
     { 
      pointList.add(event.getPoint()); 
      repaint(); 
     } 

     //-------------------------------------------------------------- 
     // Provide empty definitions for unused event methods. 
     //-------------------------------------------------------------- 
     public void mouseClicked(MouseEvent event) {} 
     public void mouseReleased(MouseEvent event) {} 
     public void mouseEntered(MouseEvent event) {} 
     public void mouseExited(MouseEvent event) {} 

     @Override 
     public void mouseDragged(MouseEvent event) 
     { 
      pointList.add(event.getPoint()); 
      dotSizes[pointList.size()-1] = SIZE; 
      //store size of dot here 
      repaint(); 

     } 

     @Override 
     public void mouseMoved(MouseEvent event) {} 

     @Override 
     public void mouseWheelMoved(MouseWheelEvent event) 
     { 
      SIZE -= event.getWheelRotation(); 
      repaint(); 
     } 
    } 
} 
+0

Почему бы не использовать 'ArrayList' для обоих? – MadProgrammer

ответ

0
for (Point spot : pointList) 
     //change size to sizes[n] 
     page.fillOval(spot.x-dotSizes[pointList.size()-1], spot.y-dotSizes[pointList.size()-1], dotSizes[pointList.size()-1]*2, dotSizes[pointList.size()-1]*2); 

Это ваша проблема. Вы не изменяете размер до размера [n], но вы меняете размер каждого на размер [pointList.size() - 1] или, другими словами, последний. Вам, вероятно, придется использовать регулярный цикл, если вы не хотите найти индекс текущей точки.

+0

Да, перешел на обычный цикл, и он отлично поработал. Благодарю. – Josh

6

В этом коде:

for (Point spot : pointList) 
    //change size to sizes[n] 
    page.fillOval(spot.x-dotSizes[pointList.size()-1], spot.y-dotSizes[pointList.size()-1], dotSizes[pointList.size()-1]*2, dotSizes[pointList.size()-1]*2); 

вы используете один размер точек для всех точек: размер последней точки, которая была добавлена. (Там даже комментарий здесь, чтобы исправить эту проблему!) Вам нужно перебирать с индексом, так что вы можете индекс в dotSizes массива, а также pointListArrayList:

for (int i = 0; i < pointList.size(); ++i) { 
    Point spot = pointList.get(i); 
    int size = dotSizes[i]; 
    page.fillOval(spot.x-size, spot.y-size, size*2, size*2); 
} 

Было бы гораздо лучше, чтобы определить свои собственные «точка с размером» класс, который инкапсулирует Point и size:

class Spot extends Point { 
    public int size; 
    public Spot(int x, int y, int size) { 
     super(x, y); 
     this.size = size; 
    } 
} 

Затем измените ваш pointList к ArrayList<Spot>, и вы можете вернуться к итерации по одному списку:

for (Spot spot : pointList) 
    page.fillOval(spot.x-spot.size, spot.y-spot.size, 2*dot.size, 2*dot.size); 

Конечно, вам также необходимо будет обновить код, который соответственно добавит точки в список.

Как в стороне, мне кажется, что ваш обработчик mousePressed имеет ошибку: он не добавляет размер, когда он добавляет точку. Переход на класс Spot также поможет избежать такой проблемы.

Смежные вопросы