webForumDet fria alternativet

public void paint, varför anropas den inte?

18 svar · 419 visningar · startad av Skies

SkiesMedlem sedan apr. 200317 inlägg
#1

Tjejen är igång igen ;)

Har ändrat i koden sen tidigare idag... så nu har jag ett annat problem. Varför går inte programmet in i paint och ritar ut linjen?

Här kommer koden:

[BLUE]

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

        
       public class Logik
       {
         private Frame f;
	 private Button skapa, svara, skicka_taemot,ta_bort;
	 //private Lyss ly;
	 private Panel p1,p2;
	 private Graphics gr;
	 
	
	
        public Logik()
        {
          //ly=new Lyss(this);
          
          f=new Frame("Mailprogrammet Mail @ It");
          //f.addWindowListener(ly);
          
          skapa=new Button ("Skapa");
          //skapa.addActionListener(ly);
          
          svara=new Button ("Svara");
          //svara.addActionListener(ly);
	  
         skicka_taemot=new Button ("Skicka/Ta emot");
          //skicka_taemot.addActionListener(ly);
          
          ta_bort=new Button ("Ta bort");
          //ta_bort.addActionListener(ly);

	  

	  p1=new Panel();
	  //p2=new Panel();

	  p1.add(skapa);
	  p1.add(svara);
	  p1.add(skicka_taemot);
	  p1.add(ta_bort);
	  //p1.add(Color blue);
	  
	
	  f.setBackground(Color.yellow);
          f.setLayout(new FlowLayout());
          f.add(skapa);
	  f.add(svara);
	  f.add(skicka_taemot);
	  f.add(ta_bort);
	
	  
         f.setSize(600,550);
 	  f.setLocation(100,100);
          f.setVisible(true);
	  
         }
	  
         public void paint(Graphics gr)
	 {
	  gr.setColor(Color.black);
	  gr.drawLine(10,10,100,100);
	}

              public static void main(String[] args)
              {
                   new Logik();
              }
      
}

Tacksam för svar! :)

PeWMedlem sedan juni 200010 432 inlägg
#2

Du anropar ju inte paint.. ;)

SkiesMedlem sedan apr. 200317 inlägg
#3

Nej, jag vet...låter helkonstigt. jag hörde nämligen förut att den inte behövde anropas... men ok, då behövde den det iaf då :)

Testar igen, tack för hjälpen! :)

ViktorMedlem sedan aug. 20021 752 inlägg
#4

Behöver du inte ärva från någon AWT komponent? Typ Frame eller liknande.

/Viktor

SkiesMedlem sedan apr. 200317 inlägg
#5

Ärver jag inte redan allt från awt genom import.java.awt.*; ?

ViktorMedlem sedan aug. 20021 752 inlägg
#6

Nej, ärver gör du genom extends

public class Logik extends Frame
{
}

Om du är helt ny på Java så tycker jag att du ska börja med consol program och när du har lärt dig grunderna i Java så ska du gå över till fönster programering.

/Viktor

SkiesMedlem sedan apr. 200317 inlägg
#7

Jo, jag vet att man ärver med extends...missuppfattade dig, förlåt.

Dessutom har jag lärt mig grunderna i java..var bara ett tag sen som jag höll på med det :)

xj220Medlem sedan apr. 20037 inlägg
#8

Tänkte bara påpeka att du bör anropa repaint och inte paint...

SkiesMedlem sedan apr. 200317 inlägg
#9

*suck* jag måste va dummare än en kokosboll för tillfället. Får det iaf inte att fungera. Har anropat paint, gick inte, anropade repaint, gick inte det heller :( Förstår inte varför inte linjen ritas ut...

ViktorMedlem sedan aug. 20021 752 inlägg
#10

Posta lite ny kod så ska det nog gå att lösa :)

/Viktor

SkiesMedlem sedan apr. 200317 inlägg
#11

Tack, det vore jättesnällt. Det är säkert hur enkelt som helst, bara att jag inte kan se det :) Man blir lite stirrig efter att ha testat samma sak i 6 timmar ungefär ;)

Nu är inte anropet till paint (eller repaint eller vad det nu ska va) med i koden...

[BLUE]
import java.awt.*;
//import java.awt.event.*;

        
             public class Logik 
             {
                 private Frame f;
	 private Button skapa, svara, skicka_taemot,ta_bort;
	 //private Lyss ly;
	 private Panel p1,p2;
	 private Graphics gr;

	
	   public Logik()
                  {
                 //ly=new Lyss(this);
          
                   f=new Frame("Mailprogrammet Mail @ It");
                //f.addWindowListener(ly);
          
                  skapa=new Button ("Skapa");
               //skapa.addActionListener(ly);
          
                 svara=new Button ("Svara");
              //svara.addActionListener(ly);
	  
               skicka_taemot=new Button ("Skicka/Ta emot");
            //skicka_taemot.addActionListener(ly);
          
              ta_bort=new Button ("Ta bort");
           //ta_bort.addActionListener(ly);

	  
                     p1=new Panel();
	  //p2=new Panel();

	  p1.add(skapa);
	  p1.add(svara);
	  p1.add(skicka_taemot);
	  p1.add(ta_bort);
	 
                  f.setBackground(Color.yellow);
                  f.setLayout(new FlowLayout());
                  f.add(skapa);
	  f.add(svara);
	  f.add(skicka_taemot);
	  f.add(ta_bort);

	   
                  f.setSize(600,550);
 	  f.setLocation(100,100);
                  f.setVisible(true);
                }

           public void paint(Graphics gr) // vet inte om gr behövs 
           {
	    
                  gr.setColor(Color.black);
	  gr.drawLine(10,10,100,100);
            }
	  
      public static void main(String[] args)
     {
		   
                   new Logik();
		    
      }
      
}
ViktorMedlem sedan aug. 20021 752 inlägg
#12

Jag tror du hittar svaret på problemet i min första post :)

import java.awt.*;

public class Logik extends Frame
{
	//private Frame f;
	private Button skapa, svara, skicka_taemot, ta_bort;
	//private Lyss ly;
	private Panel p1, p2;
	private Graphics gr;

	public Logik()
	{
		//ly=new Lyss(this);
		super("Mailprogrammet Mail @ It");
		//f=new Frame("Mailprogrammet Mail @ It");
		//f.addWindowListener(ly);
		
		addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				setVisible(false);
				dispose();
				System.exit(0);
			}
		});

		
		skapa= new Button("Skapa");
		//skapa.addActionListener(ly);
		svara= new Button("Svara");
		//svara.addActionListener(ly);
		skicka_taemot= new Button("Skicka/Ta emot");
		//skicka_taemot.addActionListener(ly);
		ta_bort= new Button("Ta bort");
		//ta_bort.addActionListener(ly);
		p1=new Panel();
		//p2=new Panel();
		p1.add(skapa);
		p1.add(svara);
		p1.add(skicka_taemot);
		p1.add(ta_bort);
		setBackground(Color.yellow);
		setLayout(new FlowLayout());
		add(skapa);
		add(svara);
		add(skicka_taemot);
		add(ta_bort);
		setSize(600, 550);
		setLocation(100, 100);
		setVisible(true);
	}
	
	public void paint(Graphics gr) // vet inte om gr behövs 
	{
		super(gr);
		gr.setColor(Color.black);
		gr.drawLine(10, 10, 100, 100);
		gr.drawString("This is working now!",100,100);
	}
	
	public static void main(String[] args)
	{
		new Logik();
	}
}

Ändringar som jag har gjort:

- Logik ärver nu av Frame (annars kan du inte överlagra en metod)
- Allt som du förut la på f (f.addXXX) lägger du nu direkt med addXXX eftersom Logik nu är en frame så behöver du inte skapa en ny frame.
- Eftersom det är ett arv så anroppar du super() först i din konstruktor för att sätta titeln på fönstert och initiera fönstret.
- Jag la även till en window exit funktion så att man inte behöver trycka Ctrl-Alt-Delete för att avsluta programet.

Det är det som jag har gjort och nu anroppas paint som den ska, den anroppar även den överlagrade funktionen först.

/Viktor

SkiesMedlem sedan apr. 200317 inlägg
#13

Tack så hemskt mycket för hjälpen!!!! :)
Fast en sak hänger jag inte riktigt med på...eller jo jag hänger
med på vad som händer och så, men jag förstår inte varför det
hela plötsligt löste sig bara för att man ärver frame istället för att
göra f=new frame, för det är ju nästan samma sak, eller hur?!
Lyssnarna, som är nästan enklare, tänkte jag ta senare...men tack för att du fixade "stäng" åt mig ändå ;)

aasahMedlem sedan mars 20034 471 inlägg
#14

Så här är det: Du vill att metoden paint(Graphics gr) ska se ut på ett visst sätt. I klassen Frame gör paintmetoden ingenting har jag för mig, den gör i alla fall inte det du vill att den ska göra. Så om du skapar en f = new Frame() så har din f Frames paintmetod. Att du i Logik definierar om paint hjälper inte ett dugg. När metoden paint anropas kommer f's paintmetod=Frames paintmetod att användas. Logiks paintmetod anropas aldrig.

Om du däremot låter Logik vara en subklass till Frame och definierar en paintmetod i Logik, så skriver den över (ersätter) superklassens metod med samma signatur (signatur = namn och inparametrar). När paintmetoden nu körs, kommer din paintmetod att användas i stället för den ursprungliga. Skillnaden är alltså att Logik nu är av typen Frame.

SkiesMedlem sedan apr. 200317 inlägg
#15

Ok, då förstår jag lite bättre :)
Fast problemet är nu att den inte känner igen super(gr); - den måste definieras först i konstruktorn. Men gör jag det, då känner den inte igen super(mailprogrammet... ); :(

nikoMedlem sedan juni 20022 599 inlägg
#16

Viktor menade nog:

super.paint(gr);
SkiesMedlem sedan apr. 200317 inlägg
#17

ÄNTLIGEN!!!!! *jublar* som jag har suttit med denna dumma linje.

Tack alla (för ert tålamod)! :)

SkiesMedlem sedan apr. 200317 inlägg
#18

Bestämde mig för att göra i swing istället...

men hur fungerar JSplitPane? Har inte hållt på med den förut...är det samma princip som med paint, att man måste ärva JFrame osv? eller är det bara att lägga in den som allt annat, knappar osv? Jag har testat med båda, men jag får det inte att fungera...tänkte bara så att jag vet vilken av dom som är rätt så kan jag jobba utifrån det sen :)

SkiesMedlem sedan apr. 200317 inlägg
#19

Det löste sig...hittade linjen...layouten på knapparna gjorde så att jag dolde den :)

138 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)