/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
2 classes skal snakke samme.
Fra : Ole


Dato : 16-01-03 11:18

Hej

Jeg har 2 classer, hvor jeg skal bruge metoder fra den ene til den anden.

class1
class2

jeg gør sådan

Eks....

public class class1 extends JFrame implements ActionListener {
String data = null;
String acdata = null;
class2 cla2 = new class2();
etc
etc...

Eks....
public class class2 extends JFrame implements ActionListener {
String data = null;
String acdata = null;
class1 cla1 = new class1();
etc
etc...

Men når jeg vil gøre det samme i class2 kommer den med en fejl. Hvordan kan
jeg ellers gøre dette?
Jeg er lidt ny så, det vil ik komme bag på mig hvis det er helt forkert som
jeg gjort.



 
 
Jan Kleis Nielsen (16-01-2003)
Kommentar
Fra : Jan Kleis Nielsen


Dato : 16-01-03 11:21

>Men når jeg vil gøre det samme i class2 kommer den med en fejl. Hvordan kan
Hvilken fejl ?



Ole (16-01-2003)
Kommentar
Fra : Ole


Dato : 16-01-03 11:31


> Hvilken fejl ?

Den compiler godt nok, men jeg prøver at køre programmet kommer der den her:

C:\movielister\normal version>java guiMain
Exception in thread "main" java.lang.StackOverflowError
at javax.swing.JComponent.repaint(JComponent.java:4320)
at java.awt.Component.repaint(Component.java:2363)
at javax.swing.JComponent.setBackground(JComponent.java:2276)
at javax.swing.LookAndFeel.installColors(LookAndFeel.java:58)
at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:92)
at
javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:48)
at
javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:39)
at javax.swing.JComponent.setUI(JComponent.java:445)
at javax.swing.JPanel.setUI(JPanel.java:132)
at javax.swing.JPanel.updateUI(JPanel.java:105)
at javax.swing.JPanel.<init>(JPanel.java:64)
at javax.swing.JPanel.<init>(JPanel.java:88)
at javax.swing.JPanel.<init>(JPanel.java:96)
at javax.swing.JRootPane.createGlassPane(JRootPane.java:467)
at javax.swing.JRootPane.<init>(JRootPane.java:298)
at javax.swing.JFrame.createRootPane(JFrame.java:253)
at javax.swing.JFrame.frameInit(JFrame.java:232)
at javax.swing.JFrame.<init>(JFrame.java:155)
at gui.<init>(gui.java:48)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)
at gui.<init>(gui.java:42)
at ActionMenu.<init>(ActionMenu.java:22)

og på den måde fortsætter den et langt stykke. Det er vel fordi hele
programet går i loop, eller hvad?




Jan Kleis Nielsen (16-01-2003)
Kommentar
Fra : Jan Kleis Nielsen


Dato : 16-01-03 11:38

> og på den måde fortsætter den et langt stykke. Det er vel fordi hele
> programet går i loop, eller hvad?
Ser sådan ud, siden den bliver ved med at henvise til samme linje.

Jeg ville nok gemme et link til objektet i min main tråd hvis de skal kunne
tale sammen.
(main)
Class1 k1 = new Class1();
Class2 k2 = new Class2();

De skal naturligvis angives som protected eller public

Hvis der er tale om flere end 2 objekter kan du evt. bruge et array til
objekter, der kan holde alle typer.

/jan



Ole (16-01-2003)
Kommentar
Fra : Ole


Dato : 16-01-03 12:26

> Hvis der er tale om flere end 2 objekter kan du evt. bruge et array til
> objekter, der kan holde alle typer.

øøhh oki :) er ik helt med

det jeg vil er : Ved godt det er et lamt eks. men jeg vil være sikker på du
forstår hvad jeg mener :)

---
public class gui extends JFrame implements ActionListener {
String acdata = "TEST GIVER INGEN MENNIG";
ActionMenu action = new ActionMenu();

public String getText() {
return acdata;
}

public test(){
action.testAC();
}
}
---


---
public class ActionMenu implements ActionListener {
gui GUI = new gui();

public void action() {
System.out.println(GUI.getText);
}

public void testAC() {
String accc = "something";
}
}
---

Iden er at classen ActionMenu, skal få en string fra classen gui, som den så
printer ud.
Og, at classen gui får en string fra ActionMenu, som den så printer ud.




Mikkel Bundgaard (16-01-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 16-01-03 12:21

On Thu, 16 Jan 2003 11:18:19 +0100, Ole wrote:

> Hej
>
> Jeg har 2 classer, hvor jeg skal bruge metoder fra den ene til den
> anden.
>
> class1
> class2
>
> jeg gør sådan
>
> Eks....
>
> public class class1 extends JFrame implements ActionListener {
> String data = null;
> String acdata = null;
> class2 cla2 = new class2();
class2 cla2;
> etc
> etc...
>
> Eks....
> public class class2 extends JFrame implements ActionListener {
> String data = null;
> String acdata = null;
> class1 cla1 = new class1();
class1 cla1;
> etc
> etc...
Dette kommer til at give problemer, da class1 så vil oprette et objekt af
klassen class2, som så vil oprette et objekt af klassen class1, som så
....

En mulig løsning ville være at lade begge klasser have metode, som tog en
reference til det andet objekt.

// I class2
public void setOtherClass( class1 andenKlasse ) {
cla1 = andenKlasse;
}

// I class1
public void setOtherClass( class2 andenKlasse ) {
cla2 = andenKlasse;
}

og så bruge referencen myclass1/2 i koden i de to klasser. Nu skal du
blot huske, der hvor du opretter de to klasser så skal de også lige give
deres reference til den anden klasse. Noget al a

public static void main (String args[] ) {
class1 myclass1 = new class1();
class2 myclass2 = new class2();

myclass1.setOtherClass( myclass2 );
myclass2.setOtherClass( myclass1 );
}

Håber du kan bruge disse rodede tanker til noget
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Ole (16-01-2003)
Kommentar
Fra : Ole


Dato : 16-01-03 13:18

> // I class2
> public void setOtherClass( class1 andenKlasse ) {
> cla1 = andenKlasse;
> }
>
> // I class1
> public void setOtherClass( class2 andenKlasse ) {
> cla2 = andenKlasse;


hvad er cla1 og cla2?



Mikkel Bundgaard (16-01-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 16-01-03 13:36

On Thu, 16 Jan 2003 13:17:38 +0100, Ole wrote:

<Indsat fra Oles oprindelige mail >
>>> public class class1 extends JFrame implements ActionListener {
>>> String data = null;
>>> String acdata = null;
>>> // class2 cla2 = new class2();
class2 cla2;
>>> etc
>>> etc...

>>> public class class2 extends JFrame implements ActionListener {
>>> String data = null;
>>> String acdata = null;
>>> // class1 cla1 = new class1();
class1 cla1;
>>> etc
>>> etc...
>> // I class2
>> public void setOtherClass( class1 andenKlasse ) {
>> cla1 = andenKlasse;
>> }
>>
>> // I class1
>> public void setOtherClass( class2 andenKlasse ) {
>> cla2 = andenKlasse;
>> }
>
> hvad er cla1 og cla2?
Det er navnene på dine referecer til den anden klasse. cla1 er en
reference til et objekt af klasse class1 og cla2 er en reference til et
objekt af klasse class2. Jeg brugte blot de navne, som du selv brugte i
din oprindelige besked. Dog skal variablene kun erklæres og ikke oprettes
(se oppe i koden).

brug
class cla2;
men ikke
class cla2 = new class2();

Det vil sige at variablene er klasse attributter, som først sættes af
metoden setOtherClass.

Håber det hjalp lidt på forståelsen

PS. det er Java konvention, at man navngiver sine klasser med et stor
forbogstav. F.eks. Class2.
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Ole (16-01-2003)
Kommentar
Fra : Ole


Dato : 16-01-03 14:30

> public static void main (String args[] ) {
> class1 myclass1 = new class1();
> class2 myclass2 = new class2();
>
> myclass1.setOtherClass( myclass2 );
> myclass2.setOtherClass( myclass1 );
> }

Oki jeg tror jeg er ved at ha' fat i det nu.

men de 2 klasser som bruges indeholder ikke nogen "main" det er en helt 3.
klasse, så jeg forstår ik helt i hvilken klasse "main" forstille at være i?
men det behøver vel ikke at være main, men skal det så stå i både Class1, og
Class2? eller hvad,?

Eller har jeg brug for en kop kaffe mere



Mikkel Bundgaard (16-01-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 16-01-03 14:49

On Thu, 16 Jan 2003 14:29:57 +0100, Ole wrote:

>> public static void main (String args[] ) {
>> class1 myclass1 = new class1();
>> class2 myclass2 = new class2();
>>
>> myclass1.setOtherClass( myclass2 );
>> myclass2.setOtherClass( myclass1 );
>> }
>
> Oki jeg tror jeg er ved at ha' fat i det nu.
>
> men de 2 klasser som bruges indeholder ikke nogen "main" det er en helt
> 3. klasse, så jeg forstår ik helt i hvilken klasse "main" forstille at
> være i? men det behøver vel ikke at være main, men skal det så stå i
> både Class1, og Class2? eller hvad,?
Når du udfører dit program sker dette ved at du udfører main metoden i
den klasse som du angav til java.exe. Så ovenstående main kunne enten
ligge i en af de to klasser eller i en helt tredje klasse. Ovenstående
kode i main-metoden behøver heller ikke at ligge i en main metode. Det
kunne ligeså godt ligge i konstruktøren i den tredje klasse.

Hvad er det du prøver at lave ??? (så kan det måske være at vi kan give
bedre svar )

> Eller har jeg brug for en kop kaffe mere
Kaffe er _altid_ godt
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Ole (16-01-2003)
Kommentar
Fra : Ole


Dato : 16-01-03 15:20

> Hvad er det du prøver at lave ??? (så kan det måske være at vi kan give
> bedre svar )

Det skal lige siges at jeg har selvlært alt så, der er muligvis mange ting
der kan gøres smartere, men jeg har fået det til at virke så langt =)

Jeg har oprettet
5 classes:

GuiMain: indeholder "main" som bare laver en JFrame, og overlader så resten
til Gui()
Gui: Indeholde alt det grafiske.
OpenConnection: Som laver forbindelse til en PostgreSQL-database.
ResultsModel: som stiller informationen fra db'en op så den passer i en
JTable.
ActionMenu: Som styre alle actions..

Det er så 2 Stringe i Gui(), jeg skal bruge i ActionMenu(), til at tilføje
info til db'en...... Og da jeg allerede har lavet en "ActionMenu actionmenu
= new ActionMenu();" i Gui, så jeg kan tilføje min knapper actions, kan jeg
ikke lave en tilsvarende i ActionMenu, unden det hele går i selvsving......

Håber dette hjælper lidt... For jeg er på herrens mark....?




Mikkel Bundgaard (19-01-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 19-01-03 19:23

On Thu, 16 Jan 2003 15:19:46 +0100, Ole wrote:

>> Hvad er det du prøver at lave ??? (så kan det måske være at vi kan give
>> bedre svar )
>
> Det skal lige siges at jeg har selvlært alt så, der er muligvis mange
> ting der kan gøres smartere, men jeg har fået det til at virke så langt
> =)
>
> Jeg har oprettet
> 5 classes:
>
> GuiMain: indeholder "main" som bare laver en JFrame, og overlader så
> resten til Gui()
> Gui: Indeholde alt det grafiske.
> OpenConnection: Som laver forbindelse til en PostgreSQL-database.
> ResultsModel: som stiller informationen fra db'en op så den passer i en
> JTable.
> ActionMenu: Som styre alle actions..
>
> Det er så 2 Stringe i Gui(), jeg skal bruge i ActionMenu(), til at
> tilføje info til db'en...... Og da jeg allerede har lavet en "ActionMenu
> actionmenu = new ActionMenu();" i Gui, så jeg kan tilføje min knapper
> actions, kan jeg ikke lave en tilsvarende i ActionMenu, unden det hele
> går i selvsving......
En måde at løse dette problem på, er ved at give din ActionMenu en
reference til den Gui, som har oprettet den. Det gør du ved at lade din
ActionMenu tage en paramter som argument i sin konstruktør og så oprette
den som følger:
actionmenu = new ActionMenu(this);

Dvs. at du skal have en attribut oprettet i ActionMenu
Gui myGui;

denne sættes så i konstruktøren i ActionMenu
public ActionMenu( Gui parentGui ) {
myGui = parentGui;
}

Nu kan du så i din kode bruge myGui.xxx til at kalde metoder og tilgå
attributter i din Gui.

En lettere (med samtidig grimmere) løsning er at gøre de to strenge til
public static. Nu kan du så tilgå strengene direkte fra ActionMenu bare
ved at skrive
Gui.xxxx

Dette er dog ikke særlig pænt syntes jeg . Men der er sikkert mange
andre løsninger.
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Søg
Reklame
Statistik
Spørgsmål : 177492
Tips : 31966
Nyheder : 719565
Indlæg : 6408466
Brugere : 218886

Månedens bedste
Årets bedste
Sidste års bedste