Java Problem: Anropa Graphics g från annan klass

Permalänk

Java Problem: Anropa Graphics g från annan klass

Hej! Jag har ett program som jag har delat upp i tre java filer och klasser. Använder JCreator LE2 och programmet funkar när alla klasser ligger i samma fil.

Men jag lyckas inte anropa funktionen "public void visa(Graphics g)" från en annan klass när filerna är uppdelade. Jag får felmeddelandet "cannot find symbol variable g".

Hur ska jag göra för att anropa visa funktionen från frame klassen?

Såhär ser det ut:
--------------------------------------------------------------------------------------------------

ProgB.java med main funktionen;

public class ProgB {

public static void main(String[] args) {

System.out.println("Starting Hej...");
FrameBoll mainFrame = new FrameBoll();
mainFrame.setSize(400,400);
mainFrame.setTitle("Hej");
mainFrame.setVisible(true);

}

}

----------------------------------------------------------------------------------------------

FrameBoll.java med frame funktionen:

import java.awt.*;
import java.awt.event.*;

public class FrameBoll extends Frame {

public FrameBoll() {

Boll c;
c = new Boll(10);
c.setPosition(20, 30);
c.visa(g);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
}
}

--------------------------------------------------------------------------------------------------

import java.awt.*;

public class Boll
{
private int xpos, ypos, diam;

public Boll(int d) //kontruktorn tar emot diametern
{
xpos=200;
ypos=100;
diam=d;
}

public void setPosition(int x, int y) //placering
{
xpos = x;
ypos = y;
}

public void visa(Graphics g) //ritar ut den
{
g.fillOval(xpos , ypos , diam, diam );

}

}

--------------------------------------------------------------------------------------------------

Permalänk
Medlem

I FrameBoll() kallar du på c.visa(g) utan att ha g deklarerad, du måste ju först ha en Graphics att skicka in till visa().

Edit:
Nu kan inte jag dom där awt grejjerna speciellt bra, men testa att ta bort c.visa(g) ur konstruktorn och lägg till metoden paint() till FrameBoll såhär:

void paint(Graphics g) { super.paint(g); c.visa(g); }

om inte paint() funkar testa byta namn på den till typ draw() eller update(), kommer inte ihåg vad dom har döpt det, men jag skulle gissa på någon av dom tre.

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk

Tack så mycket för ett snabbt svar! Jag hoppas att jag har förstått dig rätt och har ändrat Frameboll.java enligt nedan och får då felmeddelande:

paint(java.awt.Graphics) in FrameBoll cannot override paint(java.awt.Graphics) in java.awt.Container; attempting to assign weaker access privileges; was public

--------------------------------------------------------------------------------------------------

import java.awt.*;
import java.awt.event.*;

public class FrameBoll extends Frame {

void paint(Graphics g)
{
super.paint(g);
Boll c;
c = new Boll(10);
c.setPosition(20, 30);
c.visa(g);
}

public FrameBoll() {

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});

}

}

Permalänk
Medlem

Ja, varför du inte kan överlagra paint vet jag tyvärr inte, men du kan inte hålla på och skapa en ny boll vid varje utritning.
Skapa och placera bollen i konstruktorn och sedan rita ut den i paint.

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Medlem

Kan det vara för att du glömt att deklarera om print() är privat eller publik?

Permalänk
Medlem

Superklassens paint() är public så du måste sätta din metod som public du med (om jag inte missuppfattat detta helt och hållet).

Visa signatur

E6400 | Freezer 7 pro | P5B-Deluxe | 2gb xms2-6400 | x1900xt 256mb | Tagan 580w easycon | 320 GB sata2 & 160gb+80b sata | X-Fi Xtrememusic | Thermaltake Tsunami