Gå til innhold

Applett som henter tekst fra database, vha PHP


Anbefalte innlegg

Er det noen av dere her som har vært borti et Applet som kan hente f.eks. headlines fra en nyhetstabell vha. f.eks. PHP og deretter presentere dem en etter en...

 

Tenker en effekt a`la det man får av <marquee> bare at hver headline rykke inn og blir stående f.eks. i 2 sek før neste vises.

 

Helst noe opensource.

Lenke til kommentar
Videoannonse
Annonse

Dette er ikke ved hjelp at php (skjønner ikke hvorfor du skal ha det), og heller ikke med en "marquee"-effekt. Det er kun en timer som bytter teksten i en JLabel hvert 2. sekund. Databasedriver, url til databasen, brukernavn og passord må selvsagt byttes ut.

 

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.sql.*;

public class NewsViewer extends JApplet{

private Vector<String> news;
private JLabel text;
private int counter;

public void start(){
 setSize(300, 50);

 Container contPane = getContentPane();
 contPane.setBackground(Color.black);
 contPane.setForeground(Color.white);
 setContentPane(contPane);

 try{
 	handleDB();
 }catch(Exception e){}

 showGUI();
}

public void handleDB() throws Exception{

 String driver = "com.mysql.jdbc.Driver";
 String url = "jdbc:mysql://localhost:3306/news";

 Class.forName(driver).newInstance();
 Connection forbindelse = DriverManager.getConnection(url, "brukernavn", "passord");
 Statement setning = forbindelse.createStatement();
 ResultSet rs = setning.executeQuery("select * from newstable");

 news = new Vector<String>();

 while (rs.next()){
 	news.addElement(rs.getString("newstext"));
 }

}

public void showGUI(){
 text = new JLabel();
 text.setForeground(Color.gray);
 add(text);
 javax.swing.Timer tmr = new javax.swing.Timer(2000, new TimerListener());
 tmr.start();

}

private class TimerListener implements ActionListener{
 public void actionPerformed(ActionEvent a){
 	if (counter < news.size()){
   text.setText("" + news.elementAt(counter));
   counter++;
 	}else{
   counter = 0;
   text.setText("" + news.elementAt(counter));
   counter++;
 	}
 }
}

}

Lenke til kommentar

Hjertelig takk for kodeeksemplet, -men jeg får et problem når jeg benytter koden. Nemlig at det eneste jeg får opp er en svart boks.

 

Har selvfølgelig byttet ut sqladressen, bruker og passord samt endret queryen slik at den passer meg.

 

news.addElement(rs.getString("overskrift")); har jeg også endret... satte inn overskrift da jeg antar at det er en kolonne i tabellen min han leter etter her?

Lenke til kommentar

Eksemplet er greit nok, men fjern handleDB metoden og alle referanser til mysql. Man lar ikke en applet gjøre oppslag direkte i databasen fytti rakkern.

 

Istedet for handleDB() ha en metode omtrent som dette

 

loadNews() {

news.addElement(getParameter("newsitem1"));

news.addElement(getParameter("newsitem2"));

news.addElement(getParameter("newsitem3"));

}

 

Deretter i php siden hvor applet lastes:

 

<applet .... ....>

<param name="newsitem1" value="Nyhet 1 tekst">

<param name="newsitem2" value="Nyhet 2 tekst">

<param name="newsitem3" value="Nyhet 3 tekst">

</applet>

 

I php siden les fra databasen og fyll i tekstene dynamisk.

 

Lykke til,

Terje

Lenke til kommentar
Man lar ikke en applet gjøre oppslag direkte i databasen fytti rakkern.

 

Er ganske ny i javasammenheng, så jeg kan ikke så mye om verken det ene eller det andre. Er det usikkert fordi det er lett å decompile class-filen slik at man ser passord og brukernavn ?

Lenke til kommentar
Man lar ikke en applet gjøre oppslag direkte i databasen fytti rakkern.

 

Er ganske ny i javasammenheng, så jeg kan ikke så mye om verken det ene eller det andre. Er det usikkert fordi det er lett å decompile class-filen slik at man ser passord og brukernavn ?

Her er et eksempel på hvordan det blir seende ut

 

http://dev.kjerringoy.no/test

 

benytter bare følgende kode i HTML fila...

 

<applet code="NewsViewer.class">

<param name="newsitem1" value="Nyhet 1 tekst">

<param name="newsitem2" value="Nyhet 2 tekst">

<param name="newsitem3" value="Nyhet 3 tekst">

</applet>

 

 

public void loadNews() {

news.addElement(getParameter("newsitem1"));

news.addElement(getParameter("newsitem2"));

news.addElement(getParameter("newsitem3"));

}

 

pluss resten av koden selvfølgelig...

Lenke til kommentar

Hvis du skal gjøre som w3edr5t foreslo, må du slette hele metoden "handleDB()" og bytte ut

try
       {
           handleDB();
       }
       catch(Exception exception) { }

 

med

 

loadNews();

 

i start()-metoden.

 

Ser nå at det kan være skummelt å koble seg direkte til en database i en applet, siden man (som jeg i dette tilfellet) lett kan finne ut username/password til databasen som brukes.

 

(legg merke til at du da må hente inn data fra databasen inn til ei php-side, noe som jeg ikke kan noe om, men kanskje w3edr5t kan bistå deg med den kunnskapen)

Endret av bakrull
Lenke til kommentar
Hvis du skal gjøre som w3edr5t foreslo, må du slette hele metoden "handleDB()" og bytte ut

try
       {
           handleDB();
       }
       catch(Exception exception) { }

 

med

 

loadNews();

 

i start()-metoden.

 

Ser nå at det kan være skummelt å koble seg direkte til en database i en applet, siden man (som jeg i dette tilfellet) lett kan finne ut username/password til databasen som brukes.

 

(legg merke til at du da må hente inn data fra databasen inn til ei php-side, noe som jeg ikke kan noe om, men kanskje w3edr5t kan bistå deg med den kunnskapen)

Det har jeg gjort - akkurat slik du forklarer.. likevel får jeg kun den sorte boksen.

 

Jeg bruker JCreator for å lage programmet, men jeg undrer... når jeg lager en Java Applet via file->new-> create applet så lager den en init metode også. Mener å huske fra programmeringen på skolen at det var påkrevd...

 

Imidlertid så limer jeg kun inn koden du skrev, rett frem, når jeg forsøker å kompilere nå. Kan det være noe gærnt jeg gjør her?

 

ALL KODEN NÅ ER SLIK ->

 

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.sql.*;

public class NewsViewer extends JApplet{

private Vector<String> news;
private JLabel text;
private int counter;

public void init(){


}

public void start(){
setSize(300, 50);

Container contPane = getContentPane();
contPane.setBackground(Color.black);
contPane.setForeground(Color.white);
setContentPane(contPane);

try{
 loadNews();
}catch(Exception e){}

showGUI();
}

public void loadNews() 
{
news.addElement(getParameter("newsitem1"));
news.addElement(getParameter("newsitem2"));
news.addElement(getParameter("newsitem3"));	
}

public void showGUI(){
text = new JLabel();
text.setForeground(Color.green);
add(text);
javax.swing.Timer tmr = new javax.swing.Timer(2000, new TimerListener());
tmr.start();

}

private class TimerListener implements ActionListener{
public void actionPerformed(ActionEvent a){
 if (counter < news.size()){
  text.setText("" + news.elementAt(counter));
  counter++;
 }else{
  counter = 0;
  text.setText("" + news.elementAt(counter));
  counter++;
 }
}
}

}

Lenke til kommentar

Etter en del prøving og feiling fant jeg feilkilden. Når du fjerna metoden handleDB() så fjerna du også deklarasjonen av vectoren news. Legg til

news = new Vector<String>();

Øverst i loadNews()-metoden, så skal det fungere.

 

(Den logoen din på 2,4 mb er forøverig unødvendig stor. En filstørrelse på en tiendel hadde vært godt nok)

Endret av bakrull
Lenke til kommentar
Etter en del prøving og feiling fant jeg feilkilden. Når du fjerna metoden handleDB() så fjerna du også deklarasjonen av vectoren news. Legg til
news = new Vector<String>();

Øverst i loadNews()-metoden, så skal det fungere.

 

(Den logoen din på 2,4 mb er forøverig unødvendig stor. En filstørrelse på en tiendel hadde vært godt nok)

hehe, i know :)

 

men det er bare for testing og feiling foreløpig og i utgangspunktet på lokal webserver så jeg har ikke orket å krympe den enda.. annet enn med width og height param.

 

nå må jeg hive meg rundt å prøve løsningen din :)

Lenke til kommentar

Hei igjen,

 

Jeg testet linken overfor og applet'en laster ikke med feilen.

java.lang.ClassFormatError: NewsViewer (Bad magic number)

at java.lang.ClassLoader.defineClass0(Native Method)

at java.lang.ClassLoader.defineClass(Unknown Source)

at java.security.SecureClassLoader.defineClass(Unknown Source)

at sun.applet.AppletClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.applet.AppletClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.applet.AppletClassLoader.loadCode(Unknown Source)

at sun.applet.AppletPanel.createApplet(Unknown Source)

at sun.plugin.AppletViewer.createApplet(Unknown Source)

at sun.applet.AppletPanel.runLoader(Unknown Source)

at sun.applet.AppletPanel.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

 

Mulig at dette forårsakes av at du har kompilert applet'en med java 1.5. Det betyr at alle som benytter 1.4 eller eldre (eller Microsoft sin vm som er versjon 1.1.x) ikke kan se appleten. Prøv å kompilere med target=1.1

F.eks "javac -target 1.1 Foo.java"

 

Hvordan er badetemperaturen på Kjerringøy for tiden? :)

Lenke til kommentar

Det har pågått endel rettssaker mellom Sun og Microsoft angående java opp gjennom årene.

Jeg vet ikke detaljene men det ser ut til at Microsoft ikke lengre fikk videreutvikle sin VM og sluttet å distribuere den for et par år siden eller så. Søk på google for detaljer.

 

Allikevel er den fortsatt i bruk blant mange brukere, særlig blant større bedrifter.

Som en konsekvens av dette er det vanlig at man skriver applets som kjører på både den gamle MS java og nyere versjoner fra andre leverandører. Derfor kompilerer man med target 1.1.

 

mvh

Terje

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...