Ja, Hallo erstmal, ich weiß noch nicht, ob Sie es wußten, aber ich hätte da auch gerne mal ein Problem, und zwar:
ich will mir mit einem Splashscreen den Fortschritt von Operationen anzeigen lassen (Nötigkeit sei jetzt mal dahingestellt...ach, poste ich erstmal den Code:
Wie der Profi unschwer erkennen wird, soll es möglich sein, mitten drin auch die Nachrichten zu wechseln, funktioniert soweit auch alles ganz toll...am Anfang des Programms. Aber wenn ich mitten im Programm aus einer anderen Klasse als der Anfangsklasse versuche einen Splashscreen aufzumachen, kriege ich (im besten Fall) nur einen grauen Kasten, meistens aber gar nix zu sehen. Das Zeichnen wird einfach nicht ausgelöst! Woran kann das liegen? (und kommt mir jetzt bitte nicht mit: da mußt Du erstmal einen Thread draus machen, das hab ich jetzt echt schon alles durch...die Klasse mit Runnable erweitert und als Thread gestartet, eine Zwischenklasse aus Thread erben lassen, der den Splashscreen aufmachen sollte...alles nix zu wollen, es geht einfach nicht).
Vielen Dank im voraus
FatFire
Edit: Achso, Aufruf erfolgt dann nach dem Schema:
ich will mir mit einem Splashscreen den Fortschritt von Operationen anzeigen lassen (Nötigkeit sei jetzt mal dahingestellt...ach, poste ich erstmal den Code:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.RenderingHints;
import java.awt.Window;
import java.io.File;
public class SplashScreen extends Window{
private static final long serialVersionUID = 7531976034795497107L;
private static final RenderingHints AALIAS = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
private static String nachricht = "";
private static Image m_imageSplash = null;
private static MediaTracker m_mediaTracker = null;
private static SplashScreen splash = new SplashScreen();
public SplashScreen(){
super(new Frame());
String strImagePath = USDC.applikationspfad + File.separator + "Splash.jpg";
Dimension dimImageSize = new Dimension(350,350);
setLocation((getToolkit().getScreenSize().width - dimImageSize.width) / 2,
(getToolkit().getScreenSize().height - dimImageSize.height) / 2);
setSize(dimImageSize);
if(strImagePath!=null && dimImageSize!=null)
{
m_imageSplash = getToolkit().getImage(strImagePath);
m_mediaTracker = new MediaTracker(this);
m_mediaTracker.addImage(m_imageSplash, 0);
try
{
m_mediaTracker.waitForAll();
}
catch(InterruptedException e)
{
System.err.println("Kann Bild nicht laden");
}
}
}
public void update(Graphics g){
this.paint(g);
}
public void paint(Graphics g){
System.err.println("JOH, wird gezeichnet");
if (g instanceof Graphics2D) {
Graphics2D g2d = (Graphics2D)g;
g2d.addRenderingHints(AALIAS);
}
g.drawImage(m_imageSplash, 0, 0, getSize().width, getSize().height, this);
int fontsize = 60;
int breite = (int)(0.9 * (double)(this.getWidth()));
boolean zeichnen = false;
Font font = new Font("",0,0);
while(!zeichnen){
font = new Font("SansSerif", Font.PLAIN, fontsize);
FontMetrics metrics = g.getFontMetrics(font);
if(metrics.stringWidth(nachricht) < breite){
zeichnen = true;
}else{
fontsize -= 4;
}
}
g.setFont(font);
FontMetrics metrics = g.getFontMetrics();
int xverschiebung = metrics.stringWidth(nachricht) / 2;
g.setColor(Color.WHITE);
g.drawString(nachricht, (this.getWidth() / 2) - xverschiebung, 250);
}
public static void setNachricht(String anzeige){
nachricht = anzeige;
System.err.println(nachricht);
splash.repaint();
}
public static void showSplash(){
splash.setVisible(true);
splash.requestFocus();
}
public static void showSplash(String anzeige){
nachricht = anzeige;
showSplash();
}
public static void destroy(){
splash.setVisible(false);
}
}
Vielen Dank im voraus
FatFire
Edit: Achso, Aufruf erfolgt dann nach dem Schema:
Code:
SplashScreen.showSplash("Nachricht 1");
//Mache irgendwas
SplashScreen.setNachricht("Nachricht2");
//Mache wieder irgendwas
SplashScreen.destroy();