Just nu i M3-nätverket
Jump to content

Åtkomst


www.essential.se

Recommended Posts

www.essential.se

Nytt problem!

 

Det här är koden för min Frame:

// Ritprogram

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

public class Frame extends JFrame {
    
    public Frame() {
        setTitle("Ritprogram v1.0");
        setSize(640,480);
        Container contentPane = getContentPane();
        ButtonPanel btnPanel = new ButtonPanel();
        DrawPanel drawPanel = new DrawPanel();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(btnPanel,BorderLayout.NORTH);
        contentPane.add(drawPanel,BorderLayout.CENTER);
        drawPanel.setBackground(Color.white);
    }
    
}

Hur hänvisar jag från ActionPerformed i ButtonPanel till en metod i DrawPanel?

Link to comment
Share on other sites

Fattar inte riktigt vad du menar med att du ska hänvisa till en metod, men det du vill göra verkar vara att säga drawPanel.metod() och det är väl bara att göra anropet om du ser till att din instans av DrawPanel vet vilken instans av ButtonPanel han ska ropa på.

 

 

Link to comment
Share on other sites

www.essential.se

Det är precis det jag vill göra, men instansen skapar jag ju i min Frame, när jag sedan försöker komma åt den från min ButtonPanel så fattar den inget.

 

Jag provade att instansiera den igen, i min ActionPerformed (dvs i händelsehanteraren för knappen) men då blir det ju en ny instans, och den panel jag egentligen vill påverka påverkas inte.

 

Link to comment
Share on other sites

Finns flera sätt:

 

- Gör en metod i din frame som returnerar objektet.

- Berätta för din ButtonPanel vilket objekt den kan ropa på.

 

 

Link to comment
Share on other sites

www.essential.se

Jag gör alltså i min JFrame:

    public DrawPanel getDrawPanel() {
       return drawPanel;
   }

 

och i min JPanel:

DrawPanel drwPanel = frame.getDrawPanel();

 

Men det fungerar inte, för frame är inte instansierad i buttonPanel.

GAH....

Gått kurs sen Augusti å fixar inte ens en liten skitsak...

 

Link to comment
Share on other sites

Det skulle ju underlätta om du sa vad som inte fungerar, om du får ett kompileringsfel (och isf vilket). vad "frame" är för typ osv.

 

Min gissning är att din "frame" är en JFrame och JFrame har ingen metod som heter getDrawPanel, således måste du casta till den klass som har en getDrawPanel.

 

 

Link to comment
Share on other sites

www.essential.se

Alltså, kompileringsfel blir det hela tiden när jag provar saker, lite olika.

Här kommer all kod då..

 

Ritprogram.class:

/* Created on den 5 december 2002, 10:46 */
/** @author  Stefan Bergfeldt */

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

public class Ritprogram {
   public Ritprogram() {
   }

   public static void main(String[] args) {
       Frame frame = new Frame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.show();
   }
}

 

Frame.class

// Ritprogram

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

public class Frame extends JFrame {
   public ButtonPanel btnPanel;
   public DrawPanel drawPanel;

   public Frame() {
       setTitle("Ritprogram v1.0");
       setSize(640,480);
       Container contentPane = getContentPane();
       ButtonPanel btnPanel = new ButtonPanel();
       DrawPanel drawPanel = new DrawPanel();
       contentPane.setLayout(new BorderLayout());
       contentPane.add(btnPanel,BorderLayout.NORTH);
       contentPane.add(drawPanel,BorderLayout.CENTER);
       drawPanel.setBackground(Color.white);
   }

}

 

ButtonPanel.class

// Ritprogram

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

public class ButtonPanel extends JPanel implements ActionListener {
   JButton btnOval;
   JButton btnRect;
   JButton btnLine;

   public ButtonPanel() {
       btnOval = new JButton("Ring");
       btnRect = new JButton("Fyrkant");
       btnLine = new JButton("Linje");

       btnOval.addActionListener(this);
       btnRect.addActionListener(this);
       btnLine.addActionListener(this);

       add(btnOval);
       add(btnRect);
       add(btnLine);

       btnOval.setBackground(Color.gray);
       btnRect.setBackground(Color.gray);
       btnLine.setBackground(Color.yellow);
   }

   public void actionPerformed(ActionEvent event) {
//        DrawPanel drwPanel = Ritprogram.getDrawPanel();
       int iBtn;
       String strButtonText = event.getActionCommand();
       btnOval.setBackground(Color.gray);
       btnRect.setBackground(Color.gray);
       btnLine.setBackground(Color.gray);
       if (strButtonText=="Ring") {
           iBtn = 1;
           btnOval.setBackground(Color.yellow);
       } else if (strButtonText=="Fyrkant") {
           iBtn = 2;
           btnRect.setBackground(Color.yellow);
       } else {
           iBtn = 3;
           btnLine.setBackground(Color.yellow);
       }
       System.out.println(iBtn);
//        drwPanel.setFigure(iBtn);
   }

}

 

DrawPanel.class

// Ritprogram

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

public class DrawPanel extends JPanel {
   private int figure = 3; // 1=Oval, 2=Rect, 3=Line. Line är standard.

   public DrawPanel() {
   }

   public void setFigure(int f) {
       figure=f;
   }

   public int getFigure() {
       return figure;
   }

}

 

 

 

Just nu får jag inga kompileringsfel, men när jag gör olika försök för att anropa funktionen setFigure(int) blir det fel, eftersom den ligger i DrawPanel och jag vill anropa den från ButtonPanel (när jag klickar på en knapp).

 

Link to comment
Share on other sites

Just nu får jag inga kompileringsfel, men när jag gör olika försök för att anropa funktionen setFigure(int) blir det fel

 

Du kan inte förvänta dig att få hjälp om du inte orkar skriva ner vad du får för fel, att klistra in koden gör ingen gladare.

Första felet man får om man kompilerar din kod (med den anropet till getDrawPanel() aktivt) är:

 

ButtonPanel.java:31: cannot resolve symbol
symbol  : method getDrawPanel  ()
location: class Ritprogram
DrawPanel drwPanel = Ritprogram.getDrawPanel();
1 error

 

Jag tycker det säger ungefär allt. I din klass finns ingen statisk metod som heter getDrawPanel().

 

 

Link to comment
Share on other sites

www.essential.se

Hmm, jag tog bort den funktionen för den fungerade inte..

Anledningen att jag inte skrev ner vad jag får för fel är ju att jag inte tyckte att det spelar för roll för mitt problem är inte att jag inte förstår felmeddelandet.

 

Problemet är att jag inte kommer åt funktionen. Det jag vill göra är att anropa setFigure(int) och när jag gör det (utan nåt trixande) så får jag "Cannot resolve symbol"

 

Den där funktionen du skriver om var ett försök att göra som du skrev tidigare, skapa en metod i min frame som returnerar mitt drawPanel-objekt, men det fungerade inte.

 

Det här är liksom inte ett kompileringsfel jag försöker lösa, utan jag försöker förstå hur jag ska tänka för att kommunicera mellan olika objekt, som inte är instansierade i varandra.

 

Svårt att förklara..

 

Link to comment
Share on other sites

är ju att jag inte tyckte att det spelar för roll för mitt problem är inte att jag inte förstår felmeddelandet.

Men vi kan ju inte hjälpa dig att förstå felet om vi inte får reda på vad som är fel.

 

Det här är liksom inte ett kompileringsfel jag försöker lösa, utan jag försöker förstå hur jag ska tänka för att kommunicera mellan olika objekt, som inte är instansierade i varandra.

 

Ett objekt är objekt oavsett var du har skrivit new. Min gissning (baserad på hur du försökte ropa på din getDrawPanel() är att du inte riktigt förstått skillnaden mellan klass och instans. Du kan inte ropa på en instansmetod med Klass.metod(), du måste ropa på den med instans.metod().

[inlägget ändrat 2002-12-13 15:13:26 av fhe]

Link to comment
Share on other sites

www.essential.se

Skillnaden mellan klass och instans är jag med på, men hur jag hänvisar till en instans som är instansierad i en annan klass än den jag vill hänvisa ifrån, det är det jag inte har förstått.

 

Är du med på vad jag menar...

 

så här, typ:

 

class klass1{
 klass2 instans = new klass2();
 klass3 instans2 = new klass3();
}

class klass2{
 instans2.metod();
}

class klass3{
 public void metod() {
 }
}

 

Är du med på vad jag försöker göra?

 

Link to comment
Share on other sites

Om du skapar ett objekt i en klass och skriver en getTheObject-metod så skickar du inte objektet utan pekaren till objektet.

Om du har tre klasser.

klass1 känner till klass2

klass2 känner till klass3

 

och vill göra nått på ett objekt i klass3 från klass1 skriver du i:

 

klass3: getObject(){ return mittObject}

 

klass2: getObject2(){

return hej.getObject();

}

där hej är det objektet av klass3 du har

 

och i klass1

new Object = hej2.getObject()

där hej2 är ett objekt av klass2

 

lite rörigt kanke, men hoppas att det hjälpte lite... =)

 

Link to comment
Share on other sites

www.essential.se

Hmm, min klass1 skapar instanser av klass2 och klass3.

Från klass2 vill jag göra något i klass3.

 

Jag får inte klass2 att känna till varken klass1 eller klass3.

 

I JavaScript finns det ju parent, finns det något liknande i Java, eller finns det något annat sätt?

 

Link to comment
Share on other sites

Har inte satt mig in i koden.

Men du skulle kunna skapa klass2 och sedan när du skapar klass3 skicka med klass2-objektet.

 

Eller skapa en av klasserna som en privat klass inne i den andra klassen. Då kommer den privata klassen känna till alla instansvariabler i "huvud"-klassen.

 

public class MyClass{

 

private class MyPrivateClass{

}

}

 

 

Link to comment
Share on other sites

Enklast är att skicka in dem med en metod:

 

Dvs, gör en metod på Klass2 i stil med:

 

public void setKlass3Reference(Klass3 k3) {

m_klass3=k3;

}

 

När du har skapat bägge så kan du säga:

klass2.setKlass3Reference(klass3);

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...