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)
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.
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:
stwórz obiekt Samochod rozszerzający NewJFrame
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.
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.
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ę
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.