/ Forside/ Teknologi / Udvikling / Java / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Loade en applet fra en anden applet
Fra : Nikolaj
Vist : 637 gange
100 point
Dato : 28-02-01 10:58

Hvordan loader man en Applet med html archive tags fra en anden Applet??

 
 
Kommentar
Fra : urg


Dato : 28-02-01 11:37

Jeg er ikke helt med på spørgsmålet, vil du vise en applet inden i en anden applet?? Eller vil du bare have en classloader i en applet som loader en anden klasse?? Eller vil du have en applet til at hoppe til en ny applet via HTML (redirect)??

Eller er jeg total galt på den?

Urg

Kommentar
Fra : Nikolaj


Dato : 28-02-01 11:46

OKI. - min fejl.

Det jeg vil er følgende:
Jeg har en meget stor applet, som jeg gerne vil loade uden den grå boks. Hvis jeg loader den ved blot at sætte setBackgroud i min
init statement, så forsvinder den grå boks først når alle achives´ne, i html achive tagget er loadet. Og da dette er langt den
længste ventetid - dur den fremgangsmåde ikke.
Det jeg vil er så at lave en lille applet som loader lynhurtigt hvor jeg så kan fjerne den grå boks. Og så få denne applet
til at loade alle de klasser/archives der skal bruges.
Pointen er under alle omstændigheder bare at fjerne den /&%¤"/ grå boks mens applet´en loader

Nikolaj

Kommentar
Fra : urg


Dato : 28-02-01 12:12

Hej Nikolaj,

Okay, så er der tale om "ClassLoader" dette er en class som følger med jdk, som kan loade dine klasser ind som du skal bruge dem, her er et eksempel på brugen af classloader, håber du kan bruge det :

Urg

******************** ClassLoaderTest.java *********************
import java.util.*;
import java.io.*;
import java.lang.reflect.*;
import java.awt.*;
import java.awt.event.*;
import corejava.*;

//Din classloader
class CryptoClassLoader extends ClassLoader
{ public CryptoClassLoader(int k)
{ key = k;
}

protected synchronized Class loadClass(String name,
boolean resolve) throws ClassNotFoundException
{ // check if class already loaded
Class cl = (Class)classes.get(name);

if (cl == null) // new class
{ try
{ // check if system class
return findSystemClass(name);
}
catch (ClassNotFoundException e) {}
catch (NoClassDefFoundError e) {}

// load class bytes--details depend on class loader

byte[] classBytes = loadClassBytes(name);
if (classBytes == null)
throw new ClassNotFoundException(name);

cl = defineClass(name, classBytes,
0, classBytes.length);
if (cl == null)
throw new ClassNotFoundException(name);

classes.put(name, cl); // remember class
}

if (resolve) resolveClass(cl);

return cl;
}

private byte[] loadClassBytes(String name)
{ String cname = name.replace('.', '/') + ".class";
FileInputStream in = null;
try
{ in = new FileInputStream(cname);
ByteArrayOutputStream buffer
= new ByteArrayOutputStream();
int ch;
while ((ch = in.read()) != -1)
buffer.write(ch);
return buffer.toByteArray();
}
catch (IOException e)
{ if (in != null)
{ try { in.close(); } catch (IOException e2) {}
}
return null;
}
}

private Hashtable classes = new Hashtable();
private int key;
}

//Test classloader
public class ClassLoaderTest
extends CloseableFrame
implements ActionListener
{ public ClassLoaderTest()
{ setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
add(new Label("Class"), gbc, 0, 0, 1, 1);
add(new Label("Key"), gbc, 0, 1, 1, 1);
gbc.anchor = GridBagConstraints.WEST;
add(nameField, gbc, 1, 0, 1, 1);
add(keyField, gbc, 1, 1, 1, 1);
gbc.anchor = GridBagConstraints.CENTER;
Button loadButton = new Button("Load");
add(loadButton, gbc, 0, 2, 2, 1);
loadButton.addActionListener(this);
}

public void add(Component c, GridBagConstraints gbc,
int x, int y, int w, int h)
{ gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight = h;
add(c, gbc);
}

public void actionPerformed(ActionEvent evt)
{ try
{ ClassLoader loader
= new CryptoClassLoader(keyField.getValue());
Class c = loader.loadClass(nameField.getText());
String[] cargs = new String[] {};
Method m = c.getMethod("main",
new Class[] { cargs.getClass() });
m.invoke(null, new Object[] { cargs });
setVisible(false);
}
catch (Exception e)
{ System.out.println(e);
}
}

public static void main(String[] args)
{ Frame f = new ClassLoaderTest();
f.setSize(300, 200);
f.show();
}

private IntTextField keyField = new IntTextField(3, 4);
private TextField nameField = new TextField(30);
}



Kommentar
Fra : Nyhedsbruger


Dato : 28-02-01 13:56

Umiddelbart ....nej det kan man ikke...


"Nikolaj" <Nikolaj.news@kandu.dk> wrote in message
news:LX3n6.5742$dD.330773@twister.sunsite.dk...
> Hvordan loader man en Applet med html archive tags fra en anden Applet??
>
>
> Leveret af:
> http://www.kandu.dk/
> "Vejen til en hurtig løsning"
>



Kommentar
Fra : Nikolaj


Dato : 28-02-01 16:11

Tak for indlægget, men umiddelbart ser det ud som om ClassLoader "kun" loader klasser.
Da den klasse jeg skal bruge ligger i en jar fil sammen med ca. 2500 andre klasser, virker det lidt uoverskueligt
at skulle loade dem alle sammen.
Findes der en "achive loader", eller er jeg nødt til at kode mig ud af det ( hvis det overhovedet performancemæssigt )
kan lade sig gøre!?!
Jeg kan ikke umiddelbart finde nogen sådan "archive loader"....

Kommentar
Fra : urg


Dato : 01-03-01 02:40

Hvis din classpath er sat op til din jar fil, skulle den sagtens kunne tage de klasser som ligger i din jar fil, men hvis vi taler om rigtig mange klasser, så god fornøjelse.

Urg

Kommentar
Fra : Nikolaj


Dato : 01-03-01 09:05

Øh - jamen min classpath i html sætter jeg jo netop op via. mit archive tag, eller har jeg misforstået noget ?!?
Og det er jo netop disse achive tags jeg gerne ville undgå.....

Nikolaj

Kommentar
Fra : stofferm


Dato : 01-05-01 17:08

Hej Nicolai

I Appletter er det ikke muligt at loade via en ClassLoader som det normalt er med applikationer. Der er nemlig Security Exceptions man skal tage højde for. Derfor skal du bruge Class.forName(String) for at loade en klasse. Feks.

Du laver en applet der er meget lille og som indeholder den info du gerne vil have, og så bagefter loader du din anden klasse med Class.forName(String) og derefter kalder dne metode i den klasse du får ud af dette, for at komme igang med dne rigtige klasse. På denne måde har du en initskærm mens default ClassLoaderen (som bruges ved Class.forName(String)) kører alle klasserne igennem.

Men du har ret, det er noget tricky noget når vi så kommer til .jar filer.

Accepteret svar
Fra : janus141

Modtaget 100 point
Dato : 23-05-01 16:13

Du kan lade en Applet loade en anden Applet. Den første loader lynhurtigt, og viser et eller andet, f.eks et timeglas, mens den anden loader i baggrunden. Jeg har fundet dette eksempel til dig. Håber, du kan bruge det.

Koden er lavet af Mark Wutka (wutka@netcom.com), bare for at have det på plads.


Vh Janus




import java.applet.Applet;
import java.applet.AppletStub;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Label;


public class QuickLoader extends Applet implements Runnable, AppletStub
{
String appletToLoad;
Label label;
Thread appletThread;


public void init()
{
appletToLoad = getParameter("applet");
if (appletToLoad == null) {
label = new Label("No applet to load.");
} else {
label = new Label("Please wait - loading applet "+
appletToLoad);
}
add(label);
}


public void run()
{
if (appletToLoad == null) return;


try {
Class appletClass = Class.forName(appletToLoad);
Applet realApplet = (Applet)appletClass.newInstance();
realApplet.setStub(this);


remove(label);
setLayout(new GridLayout(1, 0));
add(realApplet);
realApplet.init();
realApplet.start();
} catch (Exception e) {
label.setText("Error loading applet.");
}
validate();
}


public void start()
{
appletThread = new Thread(this);
appletThread.start();
}


public void stop()
{
appletThread.stop();
appletThread = null;
}




Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste