Avatar billede carbonic Nybegynder
31. oktober 2007 - 12:26 Der er 8 kommentarer og
2 løsninger

Spørgsmål til min kode(nybegynder), kald osv.

Har følgende kode:
import java.awt.*;
import javax.swing.*;

public class circleDrawing extends JPanel {
    private static final long serialVersionUID = 666;
    circleDrawing() {
        setBackground(Color.magenta);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        //places the circle in the middle on the x-axis
        int cx = getWidth()/2;
        //places the circle in the middle on the y-axis
        int cy = getHeight()/2;
        int dia = 300;
        g2.setPaint(Color.black);
        g2.fillOval(cx-dia/2, cy-dia/2, dia, dia); // (x, y, x-dia, y-dia)
        setBackground(Color.magenta);
    }

    public static void main(String[] args) {
        JFrame mainFrame = new JFrame("CIRKEL");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane().add(new circleDrawing());
        mainFrame.setSize(500,500);
        //sets the windowlocation on the screen
        mainFrame.setLocation(500,150);
        mainFrame.setVisible(true);
    }
}
------------------------------------------------------------------------
Programmet virker, (pink baggrund, sort cirkel, har dog tjekket diverse kode stumper på nettet og bygget det ud fra det hvilket nok er der problemerne opstår), men helt hvorfor nogle af tingene opfører sig som de gør kunne jeg godt tænke mig at vide.
F.eks. Min main metode add'er som det eneste indhold "circleDrawing()". Men jeg går ud fra at det er selve klassen circleDrawing() der bliver kaldt og ikke metoden/contructoren. Dette konkluderer jeg ud fra at metoden ikke kalder paintComponent som er der hvor selve cirklen bliver lavet. Men er det logisk at main metoden kører alle metoder i den klasse den selv er i, undtagen contructoren, ?

Var det smart at lave paintComponent() Protected så kun metoder indenfor klassen kan bruge den?

Og hvordan kan metoden/constructeren ikke blive deklæret public/private?
og er det en logisk måde at gøre det på?

Masser af point da der er masser af spørgsmål.
Avatar billede mikkelbm Nybegynder
31. oktober 2007 - 13:02 #1
Mht. main-metoden kan man sagtens gøre det som du har gjort der. Og som din kode er i øjeblikket er det nok det eneste du kan gøre. Alternativt skal du lave en nedarvning fra en JFrame og kalde metoderne i constructoren.

paintComponent metoden skal du ikke bruge direkte. Den bliver kaldt udefra, når der er behov for at gentegne din Component (JPanel). Så jeg vil bare lade den være protected som den er i super-klassen.

Det sidste spørgsmål med metoden/constructeren forstår jeg ikke?
Avatar billede arne_v Ekspert
31. oktober 2007 - 14:12 #2
package accessibility for constructor er lidt specielt, men har vel ikke den store
betydning her
Avatar billede carbonic Nybegynder
31. oktober 2007 - 15:44 #3
mikkelbm:
Du siger paintComponent metoden først bliver kaldt når der er et behov for at tegne den.
Men hvornår opstår behovet for at tegne den i første omgang?
Med hensyn til constructoren så plejer jeg altid at lave den "public contructorNavn(){..}". Undrede mig over man bare kunne skrive den som "constructorNavn(){..}", og hvad forskellen er.

arne v:
Nej måske ikke den store betydning i et lille program som dette her, men troede stadig der skulle deklæres nogen form for om den var public, private eller andet.
Avatar billede mikkelbm Nybegynder
31. oktober 2007 - 15:48 #4
Hvis ikke du angiver visibility er den som standard protected.

Behovet for paint kommer første gang når der bliver kaldt setVisible på din frame. Så løber din frame sine childs igennem og kalde paint/paintComponent på dem. Herefter får man som regel en repaint ved focusLost/focusGained - eller ved selv at fremtvinge det.
Avatar billede arne_v Ekspert
31. oktober 2007 - 15:49 #5
nej

Java har 4 access levels:

public
protected
package
private

af uransagelige aarsager er der ikke et package keyword - ingenting betyder package visibility.
Avatar billede carbonic Nybegynder
31. oktober 2007 - 16:08 #6
mikkelbm:
så paint / paintComponent er en speciel metode hvor dette sker?
og det vil sige at "mainFrame.getContentPane().add(new circleDrawing());" bare siger at klassen circleDrawing() skal tilføjes til min JFrame?

arne v:
Ah ok, vidste ikke der var noget der hed package visibility.

Og siger mange tak allerede, i kan begge godt allerede ligge et svar så skal jeg nok give jer point når jeg engang lukker tråden.
Avatar billede mikkelbm Nybegynder
31. oktober 2007 - 16:14 #7
Ja, paint og paintComponent er specielle i den forstand at du overrider dem fra superklassen. JPanel som du nedarver fra har en paint metode der fortæller hvordan den skal tegnes - den overskriver du, når du laver en metode der hedder det samme som den i superklassen. Derfor styrer du hvordan den skal tegnes.

Og ja, "mainFrame.getContentPane().add(new circleDrawing());" tilføjer en ny instans af din circleDrawing til din mainFrame.
Avatar billede mikkelbm Nybegynder
31. oktober 2007 - 16:15 #8
Og et svar.
Avatar billede arne_v Ekspert
31. oktober 2007 - 17:05 #9
.
Avatar billede arne_v Ekspert
31. oktober 2007 - 17:05 #10
om igen
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