Avatar billede lakana Nybegynder
01. maj 2006 - 17:39 Der er 28 kommentarer og
2 løsninger

min applet blinker helt vildt

hvorfor genkalder den "ss.send" flere gange, når den er i en funktion og ikke kaldes repaint() nogle steder?

package tower;

import java.applet.*;
import java.awt.*;
import java.util.*;
import tower.skrivemetode;
import tower.socketsend.*;

public class brugere extends Applet
{
  Image bg;
  socketsend ss = new socketsend();
 
  public void paint(Graphics g)
  {
     
      bg = getImage(getCodeBase(),"plade.gif");
      g.drawImage(bg,0,0,this);
      indsaet();
    }
    public void indsaert()
    {
        ss.send("LOGIN,Guest,0,0,bolle.gif");
    }
 
}
Avatar billede mikkelbm Nybegynder
01. maj 2006 - 17:49 #1
Man bør fra paint-metoden generelt ikke lave kald til metoder der ikke har noget med det grafiske at gøre. Paint bliver kaldt efter behov.

Fra dokumentationen:

"This method is called when the contents of the component should be painted; such as when the component is first being shown or is damaged and in need of repair. The clip rectangle in the Graphics parameter is set to the area which needs to be painted. Subclasses of Component that override this method need not call super.paint(g). "
Avatar billede lakana Nybegynder
01. maj 2006 - 17:50 #2
problemet er jo jeg slet ikke kalder den, mere end en gang.. så hvor er problemet?
Avatar billede schwarz84 Nybegynder
01. maj 2006 - 17:53 #3
lakana: Javasystemet kalder som kommentaren siger paint hver gang billedet skal gentegnes. Det kan være når et andet vindue har været inde foran, eller noget helt andet...
Avatar billede lakana Nybegynder
01. maj 2006 - 17:56 #4
nå oki..
hvordan har du så tænkt dig jeg skal kalde den?
Avatar billede lakana Nybegynder
01. maj 2006 - 18:37 #5
???
Avatar billede schwarz84 Nybegynder
01. maj 2006 - 19:00 #6
Hvis den kun skal kaldes én gang, kan du jo passende gøre det fra constructoren...
Avatar billede lakana Nybegynder
01. maj 2006 - 19:01 #7
hej

package tower;

import java.applet.*;
import java.awt.*;
import java.util.*;
import tower.skrivemetode;
import tower.socketsend.*;

public class brugere extends Applet
{
  Image bg;
  socketsend ss = new socketsend();

  public void paint(Graphics g)
  {
   
      bg = getImage(getCodeBase(),"plade.gif");
      g.drawImage(bg,0,0,this);
      indsaet();
    }
    public void indsaet()
    {
        ss.send("LOGIN,Guest,0,0,bolle.gif");
    }

}

det hele min kode.. så kan du vel godt se den ikke kaldes repaint nogle steder
Avatar billede schwarz84 Nybegynder
01. maj 2006 - 19:09 #8
lakana: Læser du overhovedet hvad vi skriver? Det er ikke dig der kalder repaint, det har du ret i, men det gøres automatisk af java-systemet. Prøv at bruge constructoren, som jeg skrev før.
Avatar billede lakana Nybegynder
01. maj 2006 - 19:36 #9
ja jeg læser hvad i skriver.. men forstår ikke ret meget af de engelske ord.. er ikke ret god til engelsk.. sorry.. sidder faktisk med en engelsk dansk ordbog hehe..

sådan her ikke??

public void run()
    {
        ss.send("LOGIN,Guest,0,0,bolle.gif");
    }

den giver nemlig det samme..
Avatar billede schwarz84 Nybegynder
01. maj 2006 - 20:09 #10
Nej, sådan her:

public brugere()
    {
        ss.send("LOGIN,Guest,0,0,bolle.gif");
    }

Og så skal den ikke kaldes fra paint eller fra noget sted i din kode, den bliver kaldt når appletten startes.
Avatar billede mikkelbm Nybegynder
01. maj 2006 - 20:10 #11
Normalt bruger man en applets init metode.
Avatar billede schwarz84 Nybegynder
01. maj 2006 - 20:27 #12
Ja, det kan man også. Det er nok lidt bedre stil lige præcis med Applets. Man kan dog sagtens bruge constructoren...
Avatar billede lakana Nybegynder
01. maj 2006 - 20:27 #13
forstår bare ikke ...
når jeg ser appleten sender den godt nok til serveren...
og når andre ser den, virker det også

bare ikke hvis der er 2 på samme tid inde..

får kun én gang i console:
LOGGED IND GUEST
Avatar billede lakana Nybegynder
01. maj 2006 - 21:14 #14
skulle det ikke virke da???
Avatar billede schwarz84 Nybegynder
01. maj 2006 - 22:05 #15
Jo, men det ser ud til at der er en fejl mere et andet sted. Hvordan logger du ind? Kan systemet overhovedet have to der er logget ind med det samme navn samtidig?
Avatar billede lakana Nybegynder
01. maj 2006 - 22:25 #16
ja.. har ikke lavet tjek eller noget..

se her:

modtager:

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


package tower;

import java.net.*;
import java.io.*;
import tower.brugere.*;

public class lyt {

  public static void main(String[] arg) {
    try {
      ServerSocket server = new ServerSocket( 9999 );
      System.out.println( "[Server] Online" );
     
      Socket connection = server.accept();
   
      BufferedReader reader = new BufferedReader(
                                new InputStreamReader(
                                  connection.getInputStream() ) );
     
      String line = "";
      while (true) {
         
        line = reader.readLine();
        if (line.startsWith("LOGIN") == true)
        {
            String[] brugerdata = line.split(",");
            String brugernavn = brugerdata[1];
            String x = brugerdata[2];
            String y = brugerdata[3];
            String bolle = brugerdata[4];
            System.out.println("inde: " + brugernavn + "");
        } else {
        System.out.println(line);
    }
      }
     
     
    }
    catch ( IOException e ) {
      System.out.println( "[Server] I/O error" );
    }
  }
}








sender:
-------------------------------------------------------------

package tower;

import java.net.Socket;
import java.net.UnknownHostException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;

import java.io.*;
import tower.brugere.*;

public class socketsend
  {
    private Socket s;

    public socketsend()
      {
        try {
          s = new Socket("localhost", 9999);
        } catch (IOException e) {
          System.out.println("Could not listen on port: 9999");
        }
        }
public void send(String data)
{
 
  try {

 
 
        PrintWriter  ud = new PrintWriter (s.getOutputStream(),true);
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
       
            ud.println(data);
            ud.flush();
        } catch (IOException e) {
        System.out.println("Could not listen on port: 9999");

        }
  }
   
}





brugere ( appleten som vises )
-------------------------------------------------------------
package tower;

import java.applet.*;
import java.awt.*;
import java.util.*;
import tower.skrivemetode;
import tower.socketsend.*;

public class brugere extends Applet
{
  Image bg;
  socketsend ss = new socketsend();
 
  public void paint(Graphics g)
  {
     
      bg = getImage(getCodeBase(),"plade.gif");
      g.drawImage(bg,0,0,this);
    }
    public brugere()
    {
        ss.send("LOGIN,Guest,0,0,bolle.gif");
    }
 
}
Avatar billede mikkelbm Nybegynder
01. maj 2006 - 22:49 #17
Din server godtager kun én klient!

Noget a la:

Server:

while (true)
{
  Socket connection = server.accept();
  ServerThread thread = new ServerThread (connection); // <-- Denne klasse er en
tråd.
  thread.start();
}

...
ServerThread:

public class ServerThread extends Thread
{
    private BufferedReader reader;
   
    public ServerThread (Socket connetion)
    {
        reader = new BufferedReader(
                                new InputStreamReader(
                                  connection.getInputStream() ) );
    }
   
    public void run()
    {
        String line = "";
          while (true)
          {
            line = reader.readLine();
            if (line.startsWith("LOGIN") == true)
            {
                String[] brugerdata = line.split(",");
                String brugernavn = brugerdata[1];
                String x = brugerdata[2];
                String y = brugerdata[3];
                String bolle = brugerdata[4];
                System.out.println("inde: " + brugernavn + "");
            }
            else
            {
                System.out.println(line);
            }
        }
    }
}


Måske der skal lidt smårettelser til, men nu er den i hvert fald forberedt for at modtage mere en én klient.
Avatar billede mikkelbm Nybegynder
01. maj 2006 - 22:50 #18
Og et svar.
Avatar billede lakana Nybegynder
01. maj 2006 - 22:59 #19
skal jeg så importere serverthread??
kan man ikke bare lave alt i én fil??? den der lyt?
Avatar billede mikkelbm Nybegynder
01. maj 2006 - 23:02 #20
Jo da... 2 min.
Avatar billede mikkelbm Nybegynder
01. maj 2006 - 23:11 #21
Så bliver det sådan noget som det her:

package tower;

import java.net.*;
import java.io.*;
import tower.brugere.*;

public class lyt
{
  public static void main(String[] arg)
  {
    new lyt();
  }
 
  public void lyt()
  {
        try
        {
            ServerSocket server = new ServerSocket( 9999 );
            System.out.println( "[Server] Online" );
             
            while (true)
            {
                Socket connection = server.accept();
                ServerThread thread = new ServerThread (connection); // <-- Denne klasse er en tråd.
                thread.start();
            }
        }
        catch ( IOException e )
        {
          System.out.println( "[Server] I/O error" );
        }
    }
 
    private class ServerThread extends Thread
    {
        private BufferedReader reader;
       
        public ServerThread (Socket connection) throws IOException
        {
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream() ) );
        }
       
        public void run()
        {
            try
            {
                String line = "";
                while (true)
                {
                    line = reader.readLine();
                    if (line.startsWith("LOGIN") == true)
                    {
                        String[] brugerdata = line.split(",");
                        String brugernavn = brugerdata[1];
                        String x = brugerdata[2];
                        String y = brugerdata[3];
                        String bolle = brugerdata[4];
                        System.out.println("inde: " + brugernavn + "");
                    }
                    else
                    {
                        System.out.println(line);
                    }
                }
            }
            catch (Exception e)
            {
                System.out.println("Server error: " + e);
            }
        }
    }
}
Avatar billede lakana Nybegynder
02. maj 2006 - 15:42 #22
mikkel.. når jeg kører den så går den bare ned når alt er kørt i programmet???
den skal være online hele tiden.. altså lyt classen..


C:\Documents and Settings\Ejer\Skrivebord>cd C:\eymama

C:\eymama>java -cp . tower.lyt

C:\eymama>pause
Tryk på en vilkårlig tast for at fortsætte . . .
Avatar billede mikkelbm Nybegynder
02. maj 2006 - 16:18 #23
Ja - ups... Min fejl..

public void lyt()

skal ændres til:

public lyt()

Det er jo en contructor jeg vil lave og ikke en metode...
Avatar billede lakana Nybegynder
02. maj 2006 - 17:12 #24
åh mange tak mikkel.. det har du sgu styr på!!!


men hvorfor blinker min "baggrund" rigtigt meget når man ser appleten??

kunne det rettes eller er det meningen den skal??
Avatar billede mikkelbm Nybegynder
02. maj 2006 - 17:26 #25
Det kan jeg ikke svare på. Det har muligvis noget at gøre med den måde du tegner dit billede på.

Prøv muligvis at flytte:

bg = getImage(getCodeBase(),"plade.gif");

ud i en init-metode:

public void init()
{
  bg = getImage(getCodeBase(),"plade.gif");
}

...

Ingen garanti for at det virker - men det er et bud.
Avatar billede lakana Nybegynder
02. maj 2006 - 17:32 #26
ja ok.. det virkede ikk..
men tak for budet..

kan det ikke være fordi der skal laves til buffergraphic??
Avatar billede mikkelbm Nybegynder
02. maj 2006 - 17:34 #27
Det er muligt, ja. Jeg vil dog ikke mene det er nødvendigt medmindre man har noget bevægelse i sin applikation. Men jeg er ikke så meget inde i lige præcis applets.
Avatar billede lakana Nybegynder
02. maj 2006 - 17:40 #28
hejsa igen.. nu har jeg en fejl mere.. nu virker det med buffergraphic.. men nu skal man først trykke på appletten før at alt grafikken kommer frem.. hvordan laver jeg sådan at grafikken kommer med det samme??



package tower;

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.net.Socket;
import java.io.*;
import java.net.*;
import java.io.BufferedOutputStream.*;

import tower.skrivemetode;
import tower.socketsend.*;

public class brugere extends Applet implements MouseListener
{

Socket sock = null;
Image figur;
Image offScreen;
Graphics bufferGfx;
Image baggrund;
Point mouseDown = null;
String brugernavn;
socketsend ss = new socketsend();

  public brugere()
    {
        ss.send("LOGIN,Guest,0,0,bolle.gif");
    }

    public void init()
    {
        brugernavn = "bolletest";
        addMouseListener(this);

        figur = getImage(getCodeBase(),"bolle.gif");
        baggrund = getImage(getCodeBase(),"plade.gif"); 
        offScreen = createImage (this.getWidth(), this.getHeight());
        bufferGfx = offScreen.getGraphics();
     

    }



      public void paint(Graphics g)
      {
          bufferGfx.setColor(Color.WHITE);
         
          bufferGfx.clearRect(0,0,this.getWidth(),this.getHeight());
         
       
         
          bufferGfx.drawImage(baggrund,0,0,this);
         
        if (mouseDown != null)
             
              bufferGfx.drawImage(figur, mouseDown.x-20, mouseDown.y-15, this);     
              bufferGfx.drawString(brugernavn,mouseDown.x-20,mouseDown.y+65); 
           
              g.drawImage(offScreen,0,0,this);
      }   
   
      public void mouseClicked(MouseEvent e)
      {
        mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
      }
     
      public void mousePressed(MouseEvent e)    {
        mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
    }
      public void update (Graphics g)
      {
          paint(g);
      }
 
     
      public void mouseReleased(MouseEvent e) {}
      public void mouseEntered(MouseEvent e)    {}
      public void mouseExited(MouseEvent e)    {}
}
Avatar billede lakana Nybegynder
02. maj 2006 - 18:10 #29
kan det være noget med dette at gøre??

  if (mouseDown != null)
           
              bufferGfx.drawImage(figur, mouseDown.x-20, mouseDown.y-15, this);   
              bufferGfx.drawString(brugernavn,mouseDown.x-20,mouseDown.y+65);
         
              g.drawImage(offScreen,0,0,this);
      }

hvor den måske skulle sætte  g.drawImage(offScreen,0,0,this); først??
Avatar billede lakana Nybegynder
02. maj 2006 - 18:47 #30
får følgende fejl


Exception in thread "AWT-EventQueue-2" java.lang.NullPointerException
    at tower.brugere.paint(brugere.java:57)
    at tower.brugere.update(brugere.java:74)
    at sun.awt.RepaintArea.updateComponent(Unknown Source)
    at sun.awt.RepaintArea.paint(Unknown Source)
    at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
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