Forum zamknięte. Zapraszamy do grupy na Facebooku
Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Pytanie
02-17-2012, 07:10 PM (Ten post był ostatnio modyfikowany: 10-10-2012 09:32 PM przez Sławek.)
Post: #1
Question Pytanie
Gdy próbowałem rozwiązać zadanie z obsługi myszy, napisałem taki program (jeszcze nie skończony)

Kod:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;

import javax.swing.JPanel;


public class Panel extends JPanel implements MouseListener{
    
    /**
     *
     */
    private static final long serialVersionUID = 3101423914793440732L;
    
    
    
    LinkedList<Point> points = new LinkedList<Point>();
    
    
    
    public Panel(){
        addMouseListener(this);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
    }
    
    
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, Frame.WIDTH, Frame.HEIGHT);
        g2d.setColor(Color.BLACK);
        for (Point p: points){
            g2d.fillRect(p.x-5, p.y-5, 10, 10);
        }
    }
    
    

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mousePressed(MouseEvent e) {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        
        int x,y;
        x = e.getX();
        y = e.getY();
        
        if (e.getButton() == MouseEvent.BUTTON1){
            points.add(new Point(x, y));
            Frame.HEIGHT = (short)getHeight();
            Frame.WIDTH = (short)getWidth();
            repaint();
        }
        else if (e.getButton() == MouseEvent.BUTTON3){
            Point toRemove = null;
            
            
                for (Point z : points){
                    int xp,yp;
                    xp = (int) z.getX();
                    yp = (int) z.getY();
                    if (x >= xp-5 && y >= yp-5 && x <= xp + 5 && y <= yp + 5)
                        toRemove = z;
                    points.remove(toRemove);
                    repaint();
                    }
            }
        }
        
    }

poza tym klasa Main i Frame takie jak na przykładach w lekcjach o grafice.

Program chodzi bez problemu, ale mam pytanie, podczas działania widzę że czasami w konsoli wyświetla się takie oto coś:


Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at Panel.mouseReleased(Panel.java:84)
at java.awt.Component.processMouseEvent(Unknown Source)
[...]
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Co to za błędy, czy trzeba się ich pozbyć i jak?
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
10-08-2012, 07:31 PM
Post: #2
RE: Pytanie
Umieść w znacznikach code. Wtedy porozmawiamy
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
10-10-2012, 10:11 PM (Ten post był ostatnio modyfikowany: 10-10-2012 10:12 PM przez Sławek.)
Post: #3
RE: Pytanie
Problem jest w tym, że używasz for each, wewnątrz pętli próbujesz coś usunąć na przykład z środka listy, a później nadal chcesz iterować po tej samej liście, którą przed chwilą "popsułeś". Trzeba by to zrobić trochę inaczej jeśli już tak byś chciał, ale to już pokombinuj i poczytaj Wink Wywal remove i repainta poza for eacha.
Dodatkowo rysując po JPanel polecam rysować sobie tło, bo zaraz pojawią się kolejne problemy.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości