Uruchamianie klasy przez button

0

Witam. Chcialam stworzyc aplikacje graficzna podobna do painta. Tylko, ze utknelam. Kiedy naciskam button zeby mi rysowal kreske i wywoolywal klase to on niereaguje. Rysowanie działa poprawnie ale nie reaguje przy buttonie. Co jest zle? Ponizej kod programu:

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.ActiveEvent.*;


public class Malarz extends JFrame implements ActionListener
{
    private JPanel p = new JPanel();

    Malarz() throws Exception
    {
        Toolkit zestaw = Toolkit.getDefaultToolkit();
        Dimension rozmiarEkranu = zestaw.getScreenSize();
        int szerEkranu = rozmiarEkranu.width;
        int wysEkranu = rozmiarEkranu.height;
        setTitle("Malarz");
        setSize(szerEkranu/2,wysEkranu/2);
        setLocation(szerEkranu/4,wysEkranu/4);
        setResizable(true);
        //BufferedImage ikona = ImageIO.read(new File("ikona.gif"));
        //setIconImage(ikona);
        add(doToolBar(),BorderLayout.NORTH);
        add(p,BorderLayout.CENTER);
        setJMenuBar(doMenu());
    }

    public JMenuBar doMenu()
    {
        JMenuBar mb = new JMenuBar();

	JMenu menuPlik = new JMenu("Plik");
        JMenu menuEdycja = new JMenu("Edycja");
        JMenu menuPomoc = new JMenu("Pomoc");

        mb.add(menuPlik);
        mb.add(menuEdycja);
        mb.add(menuPomoc);

        JMenuItem elemNowy = menuPlik.add("Nowy");
        JMenuItem elemOtworz = menuPlik.add("Otwórz");
        elemOtworz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));

        JMenuItem elemZapisz = menuPlik.add("Zapisz");
        elemZapisz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));

       JMenuItem elemZapiszJako = menuPlik.add("Zapisz jako");

       JMenuItem elemZamknij = menuPlik.add(new AbstractAction("Zamknij")
       {
            public void actionPerformed(ActionEvent zdarzenie)
            {
                System.exit(0);
            }
       });
       
        menuPlik.add(elemNowy);
        menuPlik.add(elemOtworz);
        menuPlik.addSeparator();
        menuPlik.add(elemZapisz);
        menuPlik.add(elemZapiszJako);
        menuPlik.add(elemZamknij);

        JMenuItem dzialWytnij = menuPlik.add("Wytnij");
        dzialWytnij.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));

        JMenuItem dzialKopiuj = menuPlik.add("Kopiuj");
        dzialKopiuj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));

        JMenuItem dzialWklej = menuPlik.add("Wklej");
        elemZapisz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));

        menuEdycja.add(dzialWytnij);
        menuEdycja.add(dzialKopiuj);
        menuEdycja.add(dzialWklej);

        return mb;
    }

    public JToolBar doToolBar()
    {
        JToolBar jtb = new JToolBar("Kształty");
        JToggleButton przyciskLinia = new JToggleButton(new ImageIcon("linia.png"));
        przyciskLinia.setToolTipText("linia");
        przyciskLinia.setActionCommand("1");

        JToggleButton przyciskElipsa = new JToggleButton(new ImageIcon("elipsa.png"));
        przyciskLinia.setToolTipText("elipsa");

        JToggleButton przyciskProstokat = new JToggleButton(new ImageIcon("prostokat.png"));
        przyciskLinia.setToolTipText("prostokat");

        JToggleButton przyciskGumka = new JToggleButton(new ImageIcon("gumka.png"));
        przyciskGumka.setToolTipText("gumka");
  
        jtb.add(przyciskLinia);
        jtb.add(przyciskElipsa);
        jtb.add(przyciskProstokat);
        jtb.addSeparator();
        jtb.add(przyciskGumka);

        przyciskLinia.addActionListener(this);
        //Action przyciskLinia = new Rysuj();
        
        return jtb;
    }


    public void actionPerformed(ActionEvent e)
    {
        switch (Integer.parseInt(e.getActionCommand()))
        {
             case 1:
             {
                Rysuj rr = new Rysuj();
                Container powZawartosci = getContentPane();
                powZawartosci.add(rr);
            }
        }
    }

   private class Rysuj extends JPanel
   {
    private Point2D poczatek;
    private Point2D koniec;
    private ArrayList linie;

    public Rysuj (){
        linie = new ArrayList();

        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                onPress(evt);
            }
        });
        addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                onDrag(evt);
            }
        });
    }

    private void onPress(java.awt.event.MouseEvent evt) {
        poczatek = new Point2D.Double(evt.getX(), evt.getY());
    }

    private void onDrag(java.awt.event.MouseEvent evt) {
        koniec = new Point2D.Double(evt.getX(), evt.getY());
        Line2D linia = new Line2D.Double(poczatek, koniec);
        linie.add(linia);
        repaint();
        poczatek = koniec;
    }

    public void paintComponent (Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        for (int i = 0; i < linie.size(); i++)
            g2.draw ((Line2D)linie.get(i));
    }
   }

    public static void main(String[] args) throws Exception
    {
        Malarz m = new Malarz();
        m.setVisible(true);
        m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}
0
public void actionPerformed(ActionEvent e) {
	switch (Integer.parseInt(e.getActionCommand())) {
		case 1:
			Rysuj rr = new Rysuj();
			Container powZawartosci = getContentPane();
			powZawartosci.add(rr);
			break;
	}
}

Każdego casea kończysz breakiem, klamry są tam niepotrzebne.

0

Niestety to nic nie dalo. Problem jest wlasnie w samym wywolaniu klasy. Bo kiedy ten kod:

Rysuj rr = new Rysuj();
Container powZawartosci = getContentPane();
powZawartosci.add(rr);

umieszczam w glownej funkcji Malarz to program rysuje.

0

Ok faktycznie dziwna sprawa, udało mi się to obejść. zauważyłem że zmiana wielkości okna pomaga. Więc możesz napisać sobie metodę która będzie zmieniać wielkość okna o 1 piksel i zaraz po tym wracać do poprzedniego wymiaru. Zmiana będzie niezauważalna a Ty będziesz mógł rysować.

Jednak lepszym rozwiązaniem będzie w miejsce bezużytecznego w tym momencie panelu "p" wstawić panel typu Rysuj tak aby Od razu po uruchomieniu programu można było rysować.
Tobie chodzi jednak o to aby można było rysować tylko w momencie wyboru odpowiedniego narzędzia np. ołówka. Aby to zrealizować wystarczy ustawić sobie flagę (zmienną typu boolean) której wartości będą zmieniać się na przeciwne wraz z kliknięciem w przycisk ołówka. Flaga ta będzie wykorzystana w warunku gdzieś w programie (od Ciebie zależy gdzie to umieścisz, ale najrozsądniej będzie umieścić te warunki w klasie Rysuj, podobnie jak flagę i metodę do jej zmiany/ustawiania) i będzie włączać lub wyłączać rysowanie danym narzędziem.

Poza tym umieszczanie prywatnej, wewnętrznej klasy nie ma trochę sensu. Owszem można umieszczać kilka klas w jednym pliku *.java, ale rozwiązaniem preferowanym jest umieszczanie każdej nowej klasy w osobnym pliku.

0

Eee a mozesz dokladniej przyblizyc w ktorych funkcjach wstawic te flagi (true/false). Bo wiem o co ci chodzi ale nie wiem jak (wiem jak sie pisze if) i gdzie to poumieszczac? Albo po prostu pokazac w postaci kodu? :|

0

Przycisk olowka np:

boolean czyRysOlowkiem = false;

buttonOlowek.addListener(new Listener) {
    actionPerformed() {
        czyRysOlowkiem = !czyRysOlowkiem;
    }
}

A potem już tylko sprawdzasz w metodzie rysującej czy zmienna (flaga) czyRysOlowkiem jest true czy false i w zależności od tego rysujesz lub nie.

// Nie zwracaj uwagi na nazewnictwo metod czy obiektów, pisałem to przy śniadaniu na szybko.

0

Tylko w ktorym miejscu wstawic mam ten kod? Wstawialam go w roznych miejscach ale zawsze mowil to samo. Ma byc w klasie Rysowanie? Wczesniej probowalam tez dac do

public void actionPerformed(ActionEvent e)

ale to nic nie dalo. A jak ma wygladac ta metoda sprawdzajaca? Ma byc w klasie glownej(Malarz) w action performed?

public void actionPerformed(ActionEvent e)
{
     if (czyRysujOlowkiem == true)
     {
           Rysunek r = new Rysunek();
           Container powZawartosci = getContentPane();
           powZawartosci.add(r);
     }
}

To gdzie w takim razie wstawic tamten kod ktory podales i w ktorym miejscu zadeklarowac na true flage czyRysujOlowkiem?

Oczywiscie nazwy byly odpowiednio zmienione wiec to nie byl blad w nazewnictwie.

0

OK, nie wiem którego fragmentu nie zrozumiałeś ale niech Ci będzie:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;

public class Malarz extends JFrame {
	private static final long serialVersionUID = -6810890265162689269L;
	
//	private JPanel p = new JPanel();
	private Rysuj panelRysowania = new Rysuj();

	Malarz() throws Exception {
		Toolkit zestaw = Toolkit.getDefaultToolkit();
		Dimension rozmiarEkranu = zestaw.getScreenSize();
		
		int szerEkranu = rozmiarEkranu.width;
		int wysEkranu = rozmiarEkranu.height;
		
		setTitle("Malarz");
		setSize(szerEkranu / 2, wysEkranu / 2);
		setLocation(szerEkranu / 4, wysEkranu / 4);
		setResizable(true);
		
		add(doToolBar(), BorderLayout.NORTH);
//		add(p, BorderLayout.CENTER);
		add(panelRysowania, BorderLayout.CENTER);
		setJMenuBar(doMenu());
	}

	public JMenuBar doMenu() {
		JMenuBar mb = new JMenuBar();

		JMenu menuPlik = new JMenu("Plik");
		JMenu menuEdycja = new JMenu("Edycja");
		JMenu menuPomoc = new JMenu("Pomoc");

		mb.add(menuPlik);
		mb.add(menuEdycja);
		mb.add(menuPomoc);

		JMenuItem elemNowy = menuPlik.add("Nowy");
		
		JMenuItem elemOtworz = menuPlik.add("Otwórz");
		elemOtworz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));

		JMenuItem elemZapisz = menuPlik.add("Zapisz");
		elemZapisz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));

		JMenuItem elemZapiszJako = menuPlik.add("Zapisz jako");

		JMenuItem elemZamknij = menuPlik.add(new AbstractAction("Zamknij") {
			public void actionPerformed(ActionEvent zdarzenie) {
				System.exit(0);
			}
		});

		menuPlik.add(elemNowy);
		menuPlik.add(elemOtworz);
		menuPlik.addSeparator();
		menuPlik.add(elemZapisz);
		menuPlik.add(elemZapiszJako);
		menuPlik.add(elemZamknij);

		JMenuItem dzialWytnij = menuPlik.add("Wytnij");
		dzialWytnij.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));

		JMenuItem dzialKopiuj = menuPlik.add("Kopiuj");
		dzialKopiuj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));

		JMenuItem dzialWklej = menuPlik.add("Wklej");
		elemZapisz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));

		menuEdycja.add(dzialWytnij);
		menuEdycja.add(dzialKopiuj);
		menuEdycja.add(dzialWklej);

		return mb;
	}

	public JToolBar doToolBar() {
		JToolBar jtb = new JToolBar("Kształty");
		
		JToggleButton przyciskLinia = new JToggleButton(new ImageIcon("linia.png"));
		przyciskLinia.setToolTipText("linia");
		przyciskLinia.setActionCommand("1");

		JToggleButton przyciskElipsa = new JToggleButton(new ImageIcon("elipsa.png"));
		przyciskElipsa.setToolTipText("elipsa");

		JToggleButton przyciskProstokat = new JToggleButton(new ImageIcon("prostokat.png"));
		przyciskProstokat.setToolTipText("prostokat");

		JToggleButton przyciskGumka = new JToggleButton(new ImageIcon("gumka.png"));
		przyciskGumka.setToolTipText("gumka");

		przyciskLinia.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				switch (Integer.parseInt(e.getActionCommand())) {
				case 1:
//					Rysuj rr = new Rysuj();
//					Container powZawartosci = getContentPane();
//					powZawartosci.add(rr);
					
					panelRysowania.setRysujOlowkiem(!panelRysowania.isRysujOlowkiem());
					
					break;
				}
			}
		});
		
		jtb.add(przyciskLinia);
		jtb.add(przyciskElipsa);
		jtb.add(przyciskProstokat);
		jtb.addSeparator();
		jtb.add(przyciskGumka);

		return jtb;
	}
	
	public static void main(String[] args) throws Exception {
		Malarz m = new Malarz();
		m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		m.setVisible(true);
	}
}

I druga klasa (umieściłem je w osobnym pliku):

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.JPanel;

class Rysuj extends JPanel {
	private static final long serialVersionUID = 1329557161920075389L;
	
	private Point2D poczatek;
	private Point2D koniec;
	private ArrayList linie = new ArrayList();

	private boolean czyRysujOlowkiem = false;

	public Rysuj() {
		addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				poczatek = new Point2D.Double(evt.getX(), evt.getY());
			}
		});

		addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				if (czyRysujOlowkiem) {
					koniec = new Point2D.Double(evt.getX(), evt.getY());
					Line2D linia = new Line2D.Double(poczatek, koniec);
					linie.add(linia);
					repaint();
					poczatek = koniec;
				}
			}
		});
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);

		Graphics2D g2 = (Graphics2D) g;

		for (int i = 0; i < linie.size(); i++)
			g2.draw((Line2D) linie.get(i));

		repaint();
	}

	public void setRysujOlowkiem(boolean czyRysujOlowkiem) {
		this.czyRysujOlowkiem = czyRysujOlowkiem;
	}

	public boolean isRysujOlowkiem() {
		return czyRysujOlowkiem;
	}
}

P.S. Używaj znaczników cpp a nie code do oznaczania kodu Javy, widać różnicę ?

0

Wielkie dzieki za pomoc. Teraz juz bede wiedziec jak poprawnie to wywolywac. Mam tylko, jeszcze jeden problem. Kiedy chce wywolac klase kwadrat (na tej samej zasadzie co olowek) to nie chce mi rysowac. Mysle, ze probkem jest w tym:

        
add(panelKwadrat, BorderLayout.CENTER);
add(panelRysowania, BorderLayout.CENTER);

Owszem, zrobilam wywolanie dla buttona prostokat tak jak ty, ale nie chce mi rysowac

               przyciskProstokat.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e)
                        {
                            switch (Integer.parseInt(e.getActionCommand())) {
                               case 2:
                               {
                                    panelKwadrat.setRysujKwadrat(!panelKwadrat.isRysujKwadrat());
                                    break;
                               }
                            }
                        }
                        });

Dopiero kiedy wystepuje samo add(panelKwadrat, BorderLayout.CENTER); to wtedy rysuje dla tego buttona. Jak to mozna poprawic?

0

Nie jestem pewien co chcesz osiągnać. Skoro masz panel po którym możesz rysować to poco dokładasz tam jeszcze jeden ? Ustawiaj sobie to co/czym rysujesz jakimiś zmienymi (jeden działający przykład już masz).

Co do drugiego fragmentu kodu, nie jestem w stanie powiedzieć co jest źle bo nie widzę całego kodu jaki napisałaś.
Myślę że powinnać spokojnie zastanowić się co po kolei zrobić/napisać aby osiągnąć wymagany efekt, a potem przystąpić do realizacji, powinno być Ci łatwiej to wszystko wtedy ogarnąć.

0

Po co chce tworzyc kolejny? Zeby mozna bylo Od razu miec np. narysowany kwadrat a nie rysujemy go z lini. No chyba ze mozna to zrobic w klasie?

Myslalam zeby w klasie rysuj dodac metody tego typu:

  public void setRysujKwadrat(boolean czyRysujKwadrat) {
                this.czyRysujKwadrat = czyRysujKwadrat;
        }

i w funkcjach typu addMouseMotionListener dodac if dla rysowanie kwadratu itd.

Cos takiego miales na mysli prawda?

0

Tak o coś takiego mi chodziło.

Jeżeli malujesz obraz i narysujesz sobie kreskę to czy aby narysować prostokąt zmieniasz płótno na nowe ? Otóż nie bo chcesz mieć obie te figury na tym samym obrazie. Tak samo powinnaś potraktować swój panel do rysowania czyli klasę Rysuj (którą powinnaś nazwać raczej Canvas czy Plotno aby była ona intuicyjna). Rysując na płótnie zmieniasz jedynie narzędzie jakiego używasz więc tworzenie nowej instancji klasy Rysuj nie jest potrzebne.

0

Dzieki za pomoc. Ale mam jeszcze jeden problem przy rysowaniu kwadratow. W funkcji:

public void mouseDragged(MouseEvent evt) rysuje kwadrat i sama ustalam jego wielkosc:

                                if (czyRysujKwadrat) {
                                        double kon = evt.getX();
                                        double kon2 = evt.getY();
                                        double szer = kon-pocz;
                                        double dl = kon2-pocz2;

                                        Rectangle2D kw = new Rectangle2D.Double(pocz, pocz2, szer, dl);
                                        kwadrat.add(kw);
                                        repaint();
                                }

No i oczywiscie w PaintComponent to:

           for (int i = 0; i < kwadrat.size(); i++)
                        g2.draw((Rectangle2D) kwadrat.get(i));

Dzieki temu uzytkownik moze sam stworzyc jaki chce miec prostokat/kwadrat.

Ale wtedy powstaje taki efekt:

user image

I nie wiem jak to poprawic.

0

Dzieje się tak dlatego że za każdym razem kiedy kursor się poruszy zapisujesz jego punkt i rysujesz figurę. Tym sposobem tworzysz sobie wiele prostokątów o wspólnym początku.

Podczas zdarzenia mouseClick ustawiasz punkt początkowy prostokta a podczas przesuwania punkt końcowy. Problemem jest to że za każdym razem odrysowujesz taki prosotkąt pomimo tego że użytkownik jeszcze nie skończył wyznaczać wymiarów figury. Zapisz punkt końcowy podczas puszczenia przycisku myszy i wtedy narysuj prostokąt. Takie rozwiązanie spowoduje jednak że prostokąt nie będzie dynamicznie zmieniał swojego rozmiaru podczas rysowania jak to jest np. w Paincie.

Drugim rozwiązaniem może byc zapisanie całego obrazka przed rozpoczęciem rysowania, a następnie podczas poruszania myszy przechwytywać pozycję kursora i najpierw przywracać obraz z przed rozpoczęcia rysowania a następnie odrysować prostokąt o nowych wymiarach. To rozwiązanie daje Ci taki sam efekt jak w programie Paint. Algorytm można usprawnić poprzez odrysowanie tylko fragmentu który uległ zmianie a nie całego obrazka.

0

A moglbys napisac jak w tym drugim sposobie zrobic zeby zapamietal poprzedni stan zeby go potem jako ten narysowac? Myslalam o czyms takim ale nie dziala.

                    for (int i = 0; i < kwadrat.size(); i++)
                    {
                        if (i==kwadrat.size())
                        {
                            g2.draw((Rectangle2D) kwadrat.get(i));
                        }
                    }

Moze zle mysle o tym co napisales.

0

Probowalam jeszcze cos takiego:

for (int i = 0; i < kwadrat.size(); i++)
kwadrat.add(kw);

Owszem rysuje wtedy wedlug upodoban uzytkownika jeden kwadrat ale kiedy chcemy dorysowac kolejny poprzedni znika.

0

Nie ten kod co trzeba napisalam...

   for (int i = 0; i < kwadrat.size(); i++)
                  g2.draw(kw);

Ten odnosi sie do poprzedniego postu.

0

Mam wrażenie że zaczęłaś za bardzo na mnie polegać, zastanów się dlaczego Twoje rozwiązanie nie działa tak jak powinno i spróbuj je rozwiązać sama, będziesz miała z tego więcej korzyści niż z napisania postu na forum. Ja przecież nie napiszeę tego za Ciebie a chodzi o to żeby się czegoś nauczyć.

Już to, co sama napisałaś powinno być dla Ciebie wskazówką do rozwiązania:

Owszem rysuje wtedy wedlug upodoban uzytkownika jeden kwadrat ale kiedy chcemy dorysowac kolejny poprzedni znika.

0

Rozumiem, ze: g2.draw(kw) - czyli zwraca ostatnie punkty rysowania

Gdybym wiedziala czemu mi znika po nacisnieciu nowego przycisku. Wyprobowalam juz rozne sposoby i nic z tym nie chce sie ruszyc. Czemu mi to wtedy znika?

Nawet kiedy bralam opcje g2.draw((Rectangle2D) kwadrat.get(i)); i usuwalam poprzednie kwadraty to mimo, ze powstawal jeden to kolejne juz nie chcialy sie tworzyc. Rozumiem, ze to przez to ze usuwa ten narysowany wtedy tylko jak on ma wiedziec, zeby tego nie usuwal?

0

Nie wiem dlaczego tak się dzieje, ale jeżeli faktycznie robisz kopię obrazka przed rysowaniem to mogę podejrzewać że robisz to w złym miejscu i podczas rysowania drugiej figury przywracasz stan z momentu kiedy na panelu nie było żadnego prostokąta. Ale to tylko moje przypuszczenia.

0

Ja u siebie robie tak, ze wczesniejszy usuwam i rysuje kolejny dlatego przy rysowaniu powstaje tylko jeden. I tu jest wlasnie problem bo podczas tworzenia kolejnego usuwa ten zrobiony. Jak mu powiedziec zeby ten po odkliknieciu myszki zostawil w spokoju i nie usuwal go?

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