Rysowanie na panelu przez wiele wątków

0

Witam. Chciałbym aby przed odświeżeniem ekranu każdy działający wątek rysowania narysował co ma i dopiero odświeżył. Czytałem że powinienem użyć podwójnego buforowania, lecz niestety nie potrafię tego zaimplementować. Czy mógłby ktoś przerobić mi poniższy kod aby było to możliwe?Z góry dziękuję za pomoc
pozdrawiam

 


public class Klasa extends JFrame  {
        public Pane p;;
        public Klasa(){
                setSize(200,200);
                p= new Pane();
                add(BorderLayout.CENTER,p);
            dodajP(p,"Dodaj",new ActionListener()
                {
                        @Override
                        public void actionPerformed(ActionEvent arg0) {
                                Runnable r = new W(p);
                                Thread t = new Thread(r);
                                t.start();
 
                        }
                }                );
 
                setVisible(true);
 
 
 
                Runnable b = new W(p);
                Thread t = new Thread(b);
                t.start();

        }
 
        public void dodajP(Pane k,String title,ActionListener listener){
 
                JButton b = new JButton(title);
                b.addActionListener(listener);
                k.add(BorderLayout.SOUTH,b);
        }
        public static void main(String args[])
        {
                Klasa t = new Klasa();
        }
 
     
 
}
 
class Pane extends JPanel 
{
        int x =0;
        int y=0;
        String name;
        public Pane()
        {
                setSize(100,100);
                this.setBackground(Color.RED);
 
 
        }
 
        public void move(int xx,int yy,String g){x=xx;y=yy;name=g;}
 
        public void paintComponent(Graphics g)
        {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;
                g2.drawString(name,x,y);
        }
 
     
 
class W implements Runnable{
        int war = 0;
        Pane k;
        public W(Pane t)
        {
                k=t;
 
        }
        public void run() {
                for(;war<100;war++)
                {
                        Thread t = Thread.currentThread();;
 
                        k.move(2*war,war*war,t.getName());
                        k.repaint();
 
                        try {
                                Thread.sleep(700);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                //e.printStackTrace();
                        }
                }
 
        }

}}

0

Po pierwsze: nie ma czegoś takiego jak 'każdy wątek rysowania'. Rysowanie zawsze odbywa się z jednego wątku, zawsze z wątku EDT.
Po drugie: Co wynika z pierwszego rozwiązaniem problemu nie jest podwójne buforowanie. Rozwiązywanie problemu należy zacząć od nie rysowania z wątków innych niż EDT. Lekturę możesz zacząć tutaj: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

0

dzieki za odpowiedz. A czy mógłbyś lub ktoś inny odpowiedziec na moje poniższe pytania?

Chciałbym zrobić grę Packman i mam pare pytan:

  1. chciałbym aby każdą postacią w tym i playerem zajmowal sie kazdy osobny watek , czy to mozliwe?

  2. jezeli tak to używać podwójnego buforowania? jezeli tak to jak się dowiedziec ze sa kolizje? wiem jak sprawdzić czy są kolizje gdy mam te wszystkie rysowane w tablicy i kolejno je rysuje przy okazji sprawdzajac czy sie zderzaja ale jak to zrobić gdy kazdy watek rysuje na buforze?

  3. czy da sie jakos raz załadowac plansze na panel zeby nie odswiezac jej za kazdym razem?

pozdrawiam i dziekuje za pomoc

0

Nie wgryzałem się w kod, ale chyba to jest to, czego potrzebujesz: http://www.recone.org/?id=bb21&id2=65036b Chociaż w głównej mierze chodzi tam o klient-serwer, ale to nowe wątki rysują obiekty

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