Błędne wyświetlanie wczytywanych obrazków

0

Witam
Moje problemy:
*Gdy włączam program pomimo wprowadzenia zmiennej typu boolean pokazuje się kółko.
*Gdy naciskam lewy przycisk myszy prawidłowo pokazują się kółka, przy pojawianiu się nowych tylko tak jakby migają szybko i można dostrzec "w nich" krzyżyki
*Po naciśnięciu prawego przycisku pojawiają się krzyżyki ale za chwilę znikają na miejsce kołek

 
package pakiet1;

import java.awt.Canvas;
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.awt.image.BufferedImage;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class KolkoKrzyzyk extends Canvas implements MouseListener {

    public static final int SZEROKOSC = 400;
    public static final int WYSOKOSC = 400;
    public static final Color ab = new Color(255, 255, 255);
    private int x, y, x1, y1;
    public BufferedImage krzyzyk, kolko;
    boolean rysowanie =true;

    public KolkoKrzyzyk() {
        addMouseListener(this);
        JFrame okno = new JFrame("Kółko i krzyżyk");
        JPanel panel = (JPanel) okno.getContentPane();
        setBounds(0, 0, SZEROKOSC, WYSOKOSC);
        panel.setBackground(ab);
        panel.setPreferredSize(new Dimension(SZEROKOSC, WYSOKOSC));
        panel.setLayout(null);
        panel.add(this);
        okno.setBounds(0, 0, SZEROKOSC, WYSOKOSC);
        okno.setVisible(true);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public BufferedImage loadImage(String sciezka) {
        try {
            URL url = getClass().getClassLoader().getResource(sciezka);
            return ImageIO.read(url);
        } catch (Exception e) {
            System.out.println("Jest coś źle");
            return null;
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
         repaint();
        x = e.getX();
        y = e.getY();
        x1 = e.getX();
        y1 = e.getY();
        punkty.add(new Point(x, y));
        punkty1.add(new Point(x1, y1));

        if (e.getButton() == MouseEvent.BUTTON1) {
            rysowanie = true;
           
        }
        if (e.getButton() == MouseEvent.BUTTON3) {
            rysowanie = false;
             
        }

     

    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
    ArrayList<Point> punkty = new ArrayList<Point>();
ArrayList<Point> punkty1 = new ArrayList<Point>();
    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        rysujKrzyzyki(g2d);
        Graphics2D abc = (Graphics2D) g;
        rysujKoła(abc);

        if (rysowanie == true) {
            kolko = loadImage("img/kolko.gif");
            g.drawImage(kolko, x1, y1, this);
             
        } else {
            krzyzyk = loadImage("img/krzyzyk.gif");
            g.drawImage(krzyzyk, x, y, this);
        }

    }

    private void rysujKrzyzyki(Graphics2D g2d) {

        for (Point a : punkty) {
            int x = (int) a.getX();
            int y = (int) a.getY();
            
            g2d.drawImage(krzyzyk, x, y, this);
            
        }
    }
    private void rysujKoła(Graphics2D abc){
        for(Point b : punkty1){
            int x1 = (int) b.getX();
            int y1 = (int) b.getY();
            abc.drawImage(kolko, x1, y1, this);
        }


    }

    public static void main(String[] args) {
        KolkoKrzyzyk inv = new KolkoKrzyzyk();
    }
} 
0

Po kliknięciu wykonywany jest kod

        punkty.add(new Point(x, y));
        punkty1.add(new Point(x1, y1));

tzn. dodajesz punkt kliknięcia (lewego i prawego) do obu list. W metodzie paint() wykonywany jest kod

        Graphics2D g2d = (Graphics2D) g;
        rysujKrzyzyki(g2d);
        Graphics2D abc = (Graphics2D) g;
        rysujKoła(abc);

tzn. wpierw rysujesz w każdym z punktów kliknięcia krzyżyki a potem w tych samych punktach kółka, więc krzyżyków nie widać.
Obrazki wczytuj tylko raz, metoda loadImage powinna być wywołana tylko dwa razy w konstruktorze, wprowadź też sensowne nazwy zmiennych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1