habe ein applet geschrieben das selbst nru ca 46kb groß ist, allerdings lädt es noch andere daten von meiner website ~250kb und ich würde, statt der standard-animation lieber einen fortschritt dem user präsentieren auf dem gezeigt wird, was gerade geladen wird...
gibts dazu eine möglichkeit?
danke im voraus!
original post:
hi,
is there a possibility to stop an applet from showing the default loading applet animation?
i would like to show up what is going to get loaded...
as in my applet (the applet itself only got 46kb) but the stuff the applet needs to run is about 250kb therefore the applet shows the loading animation only because the applet is loading the stuff in the background....
Sind die 250 k Daten nicht schneller geladen, als das Applet zum Aufbau braucht? Ok, nimm einfach eine JProgressBar und füge diese deinem Applet, anstatt der Animation, hinzu. How To
Allerdings ist die Anzeige des Fortschritts nicht so ganz trivial, da Du die Größe der Daten und deren Durchsatz/s ermitteln musst. Dazu kannst Du z.B. einen Stream aufmachen und die empfangenen Datenpaketgrößen zusammenzählen.
Falls das zu aufwendig ist kannst Du auch "indeterminate mode" probieren, ist allerdings auch nur so eine "Knight Rider"-Animation .
nein, das applet ist sehr schnell aufgebaut (bzw wartet er beim aufbau, bis eben meine daten geladen sind)
wie man eine progressbar verwendet ist mir klar. hab schon nen downloadanager mit fortschrittsanzeige, downloadgeschwindigkeitsanzeige und estimated time calculation geschrieben... allerdings nicht als applet
ich will eigentlich nur das applet aufgebaut haben und DANN die daten laden um sie anzuzeigen. aber wenn das beim applet im init() steht klappt das nicht...
Wusste ich nicht... Init() wird vor start() aufgerufen, daher musst Du das erst starten() und dann das Laden in einem Thread starten, wie Michael... gesagt hat. Vielleicht so:
ich brauche dazu allerdings keinen eigenen thread. <-- braucht man doch
alles was man machen muss ist... im init() den loading bereich anzeigen, und sobald start() aufgerufen wird, den loading-bereich wieder entfernen und das applet mit geladenem zeugs darstellen.... <-- err man braucht nen observer, wenn man nen thread hat, sonst wird zwar geladen, und das applet schön aufgebaut, nur sind die daten dann noch nicht fix geladen
erfolgreicher code im nächsten post...
err, ich muss mich korrigieren, ich brauch den thread doch...
dazu hab ich noch nen observer implementiert und das ganze sieht dann so aus:
(lauffähiges beispiel, nicht ganz formschön, aber vielleicht hilfts jemandem )
dieses applet simuliert einen ladevorgang für 15 dateien...
LoadingApplet.java
Code:
import java.awt.BorderLayout;
public class LoadingApplet extends JApplet implements IObserver {
private static final long serialVersionUID = 1L;
public static final int STEPS = 15;;
private LoadingPanel loading;
public LoadingPanel getLoadingPanel() {
return loading;
}
public LoadingApplet() {
}
@Override
public void start() {
System.out.println("start");
// loading done, now remove the loading... stuff and show real stuff
}
@Override
public void init() {
System.out.println("init");
loading = new LoadingPanel();
loading.setProgressSteps(STEPS);
loading.addObserver(this);
add(loading, BorderLayout.CENTER);
Thread preloader = new Thread() {
@Override
public void run() {
Random r = new Random();
r.nextInt(1000);
// simulate loading of 15 files!
for (int i = 0; i < STEPS; i++) {
try {
Thread.sleep(r.nextInt(1000));
System.out.println("Simluated one file load.");
loading.setCurrentLoading("image"+r.nextInt(1000)+".jpg");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
preloader.start();
repaint();
}
@Override
public void update(IObservable o) {
remove(loading);
add(new JLabel("LOADING DONE"), BorderLayout.CENTER);
validate();
repaint();
}
}
LoadingPanel.java
Code:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;
public class LoadingPanel extends JPanel implements IObservable {
private ArrayList<IObserver> observers = new ArrayList<IObserver>();
private static final long serialVersionUID = 1L;
private JProgressBar progressBar;
private JLabel lblLoading;
private JLabel lblItemProgress;
private JLabel lblItemName;
/**
* Create the panel.
*/
public LoadingPanel() {
setLayout(new GridLayout(0, 1, 0, 0));
{
lblLoading = new JLabel("Loading...");
lblLoading.setHorizontalAlignment(SwingConstants.CENTER);
add(lblLoading);
}
{
lblItemProgress = new JLabel("Item[?/?]");
lblItemProgress.setHorizontalAlignment(SwingConstants.CENTER);
add(lblItemProgress);
}
{
lblItemName = new JLabel("New label");
lblItemName.setHorizontalAlignment(SwingConstants.CENTER);
add(lblItemName);
}
{
progressBar = new JProgressBar();
progressBar.setPreferredSize(new Dimension(150, 21));
add(progressBar);
}
}
public void setProgressSteps(int maxSteps) {
progressBar.setMaximum(maxSteps);
lblItemProgress.setText("Item [" + progressBar.getValue() + "/"
+ progressBar.getMaximum() + "]");
}
public void increaseProgress() {
progressBar.setValue(progressBar.getValue() + 1);
lblItemProgress.setText("Item [" + progressBar.getValue() + "/"
+ progressBar.getMaximum() + "]");
if (finished())
notifyObservers();
}
public boolean finished() {
return progressBar.getValue() == progressBar.getMaximum();
}
public void setCurrentLoading(String item) {
lblItemName.setText(item);
increaseProgress();
}
// OBSERVER STUFF
public void doSomething() {
notifyObservers();
}
@SuppressWarnings("unchecked")
private void notifyObservers() {
// loop through and notify each observer
Iterator i = observers.iterator();
while (i.hasNext()) {
IObserver o = (IObserver) i.next();
o.update((IObservable) this);
}
}
@Override
public void addObserver(IObserver o) {
observers.add(o);
}
@Override
public void removeObserver(IObserver o) {
observers.remove(o);
}
}
IObserver.java
Code:
public interface IObserver {
void update(IObservable o);
}