webForumDet fria alternativet

Java & MySQL databas

32 svar · 974 visningar · startad av orange

orangeMedlem sedan juni 200417 inlägg
#1

Hej

Jag håller på med ettt onlinespel och nu är det dags för matchmotorn. Själva matcherna simulerar jag i min ASP-kod och så, men jag vill att man ska kunna se dem i "live". Alltså att texten som jag sparat i en mysql-databas ska komma fram i intervaller.

Den kolumn som innehåller matchreferatet är uppbyggd ungefär såhär:

TEXT1*TEXT2*TEXT2

Tecknet * finns där för det markerar att här börjar en ny intervall. Så det jag vill försöka ådstakomma är att appleten ska skriva ut tex. TEXT1 och sedan ca 7 sekunder senare ska den skriva ut TEXT2 osv tills allt är klart :)

Är detta möjligt? Hur gör man?

ViktorMedlem sedan aug. 20021 710 inlägg
#2

Japp, det är möjligt att göra så och det är lätt också :)

Det första som du måste tänka på är att din applet och din databas måste finnas på samma dator (samma domän). Applets kan bara kontakta den dator där den har laddats ifrån.

För att kontakta din MySQL databas behöver du drivrutiner för det och det hittar du hos MySQL, JConnect tror jag den heter.

Här är lite kod som visar hur programmet skulle kunna vara uppbyggt (OBS!!! Detta är inte testat och kommer garanterat inte att fungera men det ger dig en ide om hur det kan seut.

public class MatchApplet extends JApplet implement Running
{
     private PreperadStatment ps=null;

    public void init()
    {
         //Setup database connection
         ps="SELECT * FROM referat";  //Helt fel, kommer tyvärr inte på exakt hur man gör ett preperadstatment utantill just nu.
          Thread th=new Thread(this);
           th.start();   //Starta tråden för appleten.
     }

     public void run()
     {
          try
          {
               while(true)
               {
                    redraw();    //rita om skärmen
                    sleep(7000); //sov i 7 sekunder
               }
          }
          catch(Exception e)
          {
          }
     }

     public void redraw(Graphics g)
     {
          g.drawString(getData());
     }

     public String getData()
     {
           String ret="";
          ResultSet rs=ps.execute();
           if(rs.next())
           {
                StringTokenizer st=new StringTokeniser(rs.getString(1),"*");
                 while(st.hasMoreTokens())
                       ret+=st.nextToken()+"\n";
           }
           return(ret);
     }
}

Din applet kommer att ritas om var 7'e sekund och varje gång den ritas om så hämtar du ut dina referat från databasen och ritar upp dem på appleten. Men som sagt, detta är bara ett exempel på hur grund strukturen kan seut den kommer inte att kompilera och fungera.

/Viktor

LimeMedlem sedan sep. 2001837 inlägg
#3

Jo, det är ju rätt tänkt men fel...

Om man gör getData() så kommer den att ropa på samma data varje gång och returnera alla referat. Problemställningen var att få en ny TEXT var 7:e sekund. Men i övrigt är det ju rätt.

Enklast är då att anropa getData() i init, separera texterna och lagra dessa i en lämplig Collection.

LimeMedlem sedan sep. 2001837 inlägg
#4

Hade lite tråkigt

Tjing!

Jag hade lite tråkigt så jag gjorde ett litet exempel på det du vill göra.

Jag har då valt att INTE använda trådar då trådar och Applets inte alltid spelar. Istället har jag gjort så att jag har data i en klass SevenDAO (DAO = Data Access Object) och själva "logiken" i SevenApplet.

Detta är klasserna:

/*
 * Created on Jun 29, 2004
 *  
 */
package lime;

import java.util.*;

public class SevenDAO {

	public static String baseText = "Text1*Text2*Text3*Text4";

	private ArrayList textList;
	private int currentTextPos = 0;

	public Seven() {
		textList = new ArrayList();
		StringTokenizer st = new StringTokenizer(baseText, "*");
		while (st.hasMoreElements()) {
			String text = (String) st.nextElement();
			textList.add(text);
			System.out.println("Adding " + text);
		}

	}

	public String getNextText() {
		if (textList.size() == currentTextPos)
			currentTextPos = 0;
		return (String) textList.get(currentTextPos++);
	}
	
}

och Appleten

/*
 * Created on Jun 29, 2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package lime;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class SevenApplet extends JApplet implements ActionListener  {

	// Dataklassen
	private SevenDAO sevenDAO;
	// Timer som håller reda på bytestiden.
	Timer timer;
	// Labeln som håller texten
	JLabel label;

	
	public void init()
	{
		sevenDAO = new SevenDAO();
		//Execute a job on the event-dispatching thread:
	    //creating this applet's GUI.
	    try {
	        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
	            public void run() {
	                createGUI();
	            }
	        });
	    } catch (Exception e) {
	        System.err.println("createGUI didn't successfully complete");
	    }
	    
	    //	  Set up the timer that will perform the animation.	
	    timer = new javax.swing.Timer(7000, this);
	    timer.setInitialDelay(7000);
	    timer.setCoalesce(false);
	    timer.start();

	    
	}
	
//	Called to start the applet's execution.
    public void start() {
            timer.restart();
    }

    //Called to stop (temporarily or permanently) the applet's execution.
    public void stop() {
        timer.stop();
    }

	
	private void createGUI() {
	    label = new JLabel(
	                       seven.getNextText());
	    label.setHorizontalAlignment(JLabel.CENTER);
	    label.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
	    getContentPane().add(label, BorderLayout.CENTER);
	}

	public void actionPerformed(ActionEvent e) {
		label.setText(seven.getNextText());
	
		
	}

	

}
orangeMedlem sedan juni 200417 inlägg
#5

skit schysst! Ska testa detta :)

orangeMedlem sedan juni 200417 inlägg
#6

Okej... hur ska man skriva i prompten? Jag skrev

javac -target 1.1 SevenDAO.java

OCH

javac -target 1.1 SevenApplet.java

Jag hade döpt filerna till det, men det kanske är helt fel? :S

LimeMedlem sedan sep. 2001837 inlägg
#7

jo, men du ska inte köra -target 1.1.

Varför vill du kompilera med Java 1.1??

Enklast gör man enligt följande:
Små projekt:
- skapa en katalog som heter som projektet. denna kallas PROJ_ROOT
- skapa i PROJ_ROOT en katalog som heter "src"
- skapa i PROJ_ROOT en katalog som heter "classes"
- när du vill kompilera, ställ dig i src-katalogen och skriv "javac -d ../classes *.java"

För större projekt använder man ant-skript, men det är en helt annan femma. Eller så använder man Eclipse och det inbyggda byggstödet. Funkar det med...

orangeMedlem sedan juni 200417 inlägg
#8

När jag kompilerar så får jag 4 errors... Titta på den bifogade bilden för att se hur det ser ut.

errors.gif
ViktorMedlem sedan aug. 20021 710 inlägg
#9

Det enkla sättet att få det att fungera är att kommentera bort "package lime;" från båda filerna och kompilera om så fungerar det. Men det bästa sättet är att läsa på lite om paket, t.ex Packages organize classes and interfaces eller Unwrap the package statement's potential :)

/Viktor

orangeMedlem sedan juni 200417 inlägg
#10

"kommentera bort?"

vad menas? :)

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#11

orange skrev:

kommentera bort?

Ja det gör du enkelt

// package lime;

eller

/* package lime; */

:)

orangeMedlem sedan juni 200417 inlägg
#12

Okej, jag anade det, men jag trodde du skojade :P

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#13

orange skrev:

Okej, jag anade det, men jag trodde du skojade :P

Vi på wF skojar väl aldrig? :q :OO

orangeMedlem sedan juni 200417 inlägg
#14

det gör ni säkert inte :)

Men det löste fortfarande inte de "4 errors"... :S

Aleph_OneMedlem sedan juni 2003370 inlägg
#15

Ändra några små namnmissar så ska det fungera:
SevenApplet

 //private SevenDAO sevenDAO;
private SevenDAO seven;

//sevenDAO = new SevenDAO();
seven = new SevenDAO();

SevenDAO

//public Seven()
public SevenDAO()
orangeMedlem sedan juni 200417 inlägg
#16

Okej tack för det, men nu får jag följande 2 errors... :S (alltid något) Se bilden som är bifogad

errors2.gif
LimeMedlem sedan sep. 2001837 inlägg
#17

Det är bra om du även tar med vilket kommando du slog och i vilken katalog. Blir lite lättare då.

orangeMedlem sedan juni 200417 inlägg
#18

Alright, men jag körde den kod som du gav mig :)

errors2.gif
LimeMedlem sedan sep. 2001837 inlägg
#19

Och du har kommenterat bort package-raden i båda filerna?

orangeMedlem sedan juni 200417 inlägg
#20

Jag lade till kodsnutten jag fick (kommentarerna och det) precis efter "public" raden i SevenApplet.java.. och i SevenDAO...

Nu får jag detta felmeddelande... :S

errors3.gif
Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb