Avatar billede Slettet bruger
10. januar 2004 - 18:10 Der er 8 kommentarer og
1 løsning

Fejl ved "kommunikation" mellem 2 frames

Hej...

Jeg har 3 classes, en GuiApplication og så 2 frames.

Min GuiApplication ser sådan ud:

import java.awt.*;
import javax.swing.*;

public class GuiApplication {
  boolean packFrame = false;

  public GuiApplication() {
    GuiFrame1 frame = new GuiFrame1();
    GuiFrameSpillerBedoemmelse frame1 = new GuiFrameSpillerBedoemmelse();

    if (packFrame) {
      frame.pack();
    }
    else {
      frame.validate();
    }

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = frame.getSize();
    if (frameSize.height > screenSize.height) {
      frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
      frameSize.width = screenSize.width;
    }
    frame.setLocation( (screenSize.width - frameSize.width) / 2,
                      (screenSize.height - frameSize.height) / 2);

    frame.setVisible(true);
    frame1.setVisible(false);
  }

  public static void main(String[] args) {
    try {
      UIManager.setLookAndFeel(new com.incors.plaf.kunststoff.KunststoffLookAndFeel());
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    new GuiApplication();
  }

}

I mit mainframe (GuiFrame1) skriver jeg:
  GuiFrameSpillerBedoemmelse frameSpillerBedoemmelse = new GuiFrameSpillerBedoemmelse();
Hvilket virker fint og jeg kan ændre alle ting på det andet frame.

Men hvis jeg, i mit andet frame (GuiFrameSpillerBedoemmelse), skriver:
  GuiFrame1 guiFrame1 = new GuiFrame1();

Så får jeg en fejl:
java.lang.StackOverflowError

Exception in thread "main"

Er der nogen som har løsningen på dette problem?

På forhånd tak.
Avatar billede arne_v Ekspert
10. januar 2004 - 18:27 #1
Du kan godt lade din GuiFrame1 lave en GuiFrameSpillerBedoemmelse, men hvis du
også lader GuiFrameSpillerBedoemmelse lave en GuiFrame1 går du i uendelig løkke !
Avatar billede arne_v Ekspert
10. januar 2004 - 18:28 #2
Og det giver så StackOverflowError.

Du bliver bødt til at ændre din logik, så du kun får "en af hver".
Avatar billede arne_v Ekspert
10. januar 2004 - 18:28 #3
Hvorfor ikke bare lade den ene lave den ande ?
Avatar billede Slettet bruger
10. januar 2004 - 18:29 #4
Hvordan får jeg så mulighed for at ændre noget på GuiFrame1 via GuiFrameSpillerBedoemmelse ?
Avatar billede arne_v Ekspert
10. januar 2004 - 18:47 #5
Du sender en referance med over i constructor.
Avatar billede arne_v Ekspert
10. januar 2004 - 18:49 #6
GuiFrame1:

GuiFrameSpillerBedoemmelse frameSpillerBedoemmelse = new GuiFrameSpillerBedoemmelse(this);

GuiFrameSpillerBedoemmelse:

private GuiFrame1 gf1;
public GuiFrameSpillerBedoemmelse(GuiFrame1 gf1) {
  this.gf1 = gf1;
}

så kan du kalde alle GuiFrame1 metoderne på gf1 !
Avatar billede Slettet bruger
10. januar 2004 - 19:17 #7
Nu har jeg gjort som du skrev og jeg får en fejl når jeg vil ændre title...

Se her for source: http://nopaste.php-q.net/33902

Min fejl er:
java.lang.NullPointerException

    at GuiFrameSpillerBedoemmelse.jButton1_actionPerformed(GuiFrameSpillerBedoemmelse.java:239)

    at GuiFrameSpillerBedoemmelse_jButton1_actionAdapter.actionPerformed(GuiFrameSpillerBedoemmelse.java:262)

    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)

    at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)

    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)

    at java.awt.Component.processMouseEvent(Component.java:5100)

    at java.awt.Component.processEvent(Component.java:4897)

    at java.awt.Container.processEvent(Container.java:1569)

    at java.awt.Component.dispatchEventImpl(Component.java:3615)

    at java.awt.Container.dispatchEventImpl(Container.java:1627)

    at java.awt.Component.dispatchEvent(Component.java:3477)

    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)

    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)

    at java.awt.Container.dispatchEventImpl(Container.java:1613)

    at java.awt.Window.dispatchEventImpl(Window.java:1606)

    at java.awt.Component.dispatchEvent(Component.java:3477)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)

    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Avatar billede arne_v Ekspert
10. januar 2004 - 19:34 #8
Jeg tror at du kalder den forkerte constructor !

Erstat:

public GuiFrameSpillerBedoemmelse(GuiFrame1 gf1) {
    this.gf1 = gf1;
  }

  public GuiFrameSpillerBedoemmelse() {
    try {
      jbInit();
    }

med:

public GuiFrameSpillerBedoemmelse(GuiFrame1 gf1) {
    this.gf1 = gf1;
    try {
      jbInit();
    }

og lave den med:

GuiFrameSpillerBedoemmelse frameSpillerBedoemmelse = new GuiFrameSpillerBedoemmelse(this);
Avatar billede Slettet bruger
10. januar 2004 - 19:40 #9
Perfekt, mange tak for den hurtige og effektive hjælp :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester