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 :)
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.
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.
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());
}
}
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...