31. oktober 2007 - 12:26Der 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å?
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?
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.
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.
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.
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.
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.