Rozszerzanie JFrame z implementacja Runnable wiesza program

Tworze w Netbeansie w pakiecie nowy JFrame, potrzebuję uruchomic dwa wątki i buduje nową klase która dziedziczy po tym JFrame który stowrzył netbeans, wiadomo że są w nim kontrolki i cały design. tylko że jak dołoże tej klasie interfejs Runnable to już zaczyna procek chodzić na maxa a program pluje w konsole te same linijki:

Exception in thread "main" java.lang.StackOverflowError

        at java.util.Hashtable.put(Hashtable.java:399)

        at sun.java2d.Disposer.add(Disposer.java:121)

        at sun.java2d.Disposer.addRecord(Disposer.java:89)

        at sun.java2d.windows.GDIWindowSurfaceData.initOps(Native Method)

        at sun.java2d.windows.GDIWindowSurfaceData.(GDIWindowSurfaceData.java:256)

        at sun.java2d.windows.GDIWindowSurfaceData.createData(GDIWindowSurfaceData.java:113)

        at sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface(D3DScreenUpdateManager.java:161)

        at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:394)

        at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:369)

        at sun.awt.windows.WComponentPeer.setBounds(WComponentPeer.java:148)

        at sun.awt.windows.WWindowPeer.setBounds(WWindowPeer.java:517)

        at sun.awt.windows.WComponentPeer.initialize(WComponentPeer.java:708)

        at sun.awt.windows.WCanvasPeer.initialize(WCanvasPeer.java:75)

        at sun.awt.windows.WPanelPeer.initialize(WPanelPeer.java:58)

        at sun.awt.windows.WWindowPeer.initialize(WWindowPeer.java:132)

        at sun.awt.windows.WFramePeer.initialize(WFramePeer.java:108)

        at sun.awt.windows.WComponentPeer.(WComponentPeer.java:669)

        at sun.awt.windows.WCanvasPeer.(WCanvasPeer.java:27)

        at sun.awt.windows.WPanelPeer.(WPanelPeer.java:54)

        at sun.awt.windows.WWindowPeer.(WWindowPeer.java:128)

        at sun.awt.windows.WFramePeer.(WFramePeer.java:92)

        at sun.awt.windows.WToolkit.createFrame(WToolkit.java:383)

        at java.awt.Frame.addNotify(Frame.java:460)

        at java.awt.Window.pack(Window.java:704)

        at javaapplication13.NewJFrame.initComponents(NewJFrame.java:58)

        at javaapplication13.NewJFrame.(NewJFrame.java:8)

        at javaapplication13.Samochod.(NewJFrame.java:86)

        at javaapplication13.NewJFrame.(NewJFrame.java:10)

        at javaapplication13.Samochod.(NewJFrame.java:86)

        at javaapplication13.NewJFrame.(NewJFrame.java:10)

        at javaapplication13.Samochod.(NewJFrame.java:86)

Epicko przepełniłeś stos rekurencją.

Konstruktor klasy NewJFrame tworzy nowy obiekt klasy Samochod, a konstruktor klasy Samochod tworzy nowy obiekt klasy NewJFrame. I w ten sposób przepełniasz stos zarówno wywoływanych metod, jak i pamięci.

Inaczej to musisz rozplanować te tworzenie tych obiektów. Jeżeli w Samochod potrzebujesz obiekt klasy NewJFrame, który z kolei tworzy obiekt Samochod, to przekaż ten NewJFrame w konstruktorze.

tego akurat nie ma,

potrzebuje w NewJFrame obiekt klasy Samochód, a w Mainie obiekt klasy NewJFrame… mała różnica ale dalej chodzi o te przeładowania?

Dodane 30.07.2011 (So) 9:00

Ogólnie problem polega na tym:

klasa a extends JFrame


b obiekt = new b(); 


klasa b extends a implements runnable

Dodane 30.07.2011 (So) 9:01

właściwie b nie musi dziedziczyć tylko że wtedy nie mam dostępu do kontrolek z a, nawet gdy są publiczne ;/

To co podałeś jako przyczyna problemu, nie jest problemem. nie runnable jest problemem, tylko źle rozumiane pojęcie dziedziczenia.

Sorry, nie dopatrzyłem. Stackuje się w , czyli w inicjalizacji, nie konstruktorze.

czy to nie wygląda tak:

class NewJFrame{

    public Samochod sam=new Samochod();

}

class Samochod extends NewJFrame{

}

Jeśli tak, to z punktu widzenia javy przy tworzeniu obiektu wygląda to tak:

  1. stwórz obiekt Samochod rozszerzający NewJFrame

  2. Wykonaj inicjalizację klasy nadrzędnej NewJFrame:

2.1. stwórz obiekt Samochod rozszerzający NewJFrame

2.2. Wykonaj inicjalizację klasy nadrzędnej NewJFrame:

2.2.1. stwórz obiekt Samochod rozszerzający NewJFrame

2.2.2. Wykonaj inicjalizację klasy nadrzędnej NewJFrame:

2.2.2.1. stwórz obiekt Samochod rozszerzający NewJFrame

2.2.2.2 Wykonaj inicjalizację klasy nadrzędnej NewJFrame:

I tu wpada w przepełnianie stosu.

jeżeli z klasy Samochod musisz odwołać się do pól NewJFrame, a ten NewJFrame ma przechowywać Samochod, to dziedziczenie w tym momencie jest najgorszym rozwiązaniem. Nawet rozwiązaniem nie jest, bo takie coś nie ma prawa działać.

W konstruktorze Samochod przekaż po prostu referencję do tego NewJFrame i zrób interfejs publicznych metod.

Daj więcej kodu, bo z fusów nie umiem wróżyć.

class NewJFrame extends JFrame {

     private jTextArea; 

}

class Samochod extends NewJFrame implements Runnable{

public void run()

{

try{

//tutaj potrzebuję wrzucać tekst do jTextArea, to będzie jakby konsola w programie i będzie wątek wpisywał co sie dzieje...

}catch(Exception e){}

}

}

W tym kodzie nie ma błędu. Ale rozszerzając klasę tworzysz nowy element JTextArea. Tak jak powiedziałem: przekaż referencję potrzebnego obiektu do tej klasy Samochod i jej uzywaj, a nie dziedzicz, bo wtedy robisz całkiem nowe obiekty.

możesz podać przykład? aż taki biegły nie jestem

class Okno extends JFrame{

    Osoba o;

    Okno(){

        o=new Osoba(this);

    }

    JTextField dane;

    public void setDane(String str){

        dane.setText(str);

    }

}


class Osoba{

    Okno o;

    public Osoba(Okno o){

        this.o=o;

        o.setDane("Info");

    }

}

nie rozumiem jak, ale działa :slight_smile: dzieki

Działa normalnie, bo przekazujesz referencję do obiektu (link do niego), a nie tworzysz nowego.

Zrobiłeś po prostu tworzenie siebie samego rekurencyjne.

A żeby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję :slight_smile:

jak widze 90% wątków na forum z problemami z Javy to twoje tematy. Poczytaj jakieś kursy programowania, niekoniecznie Javy, bo masz problemy z samym programowaniem.