Moin,
ich habe derzeit ein ganz seltsames Problem mit einem von JDialog abgeleiteten eigenen Dialog-Klasse.
Ziel: einen übergebenen Text in einem halbtransparenten Fenster für eine bestimmte Zeit anzuzeigen
hierzu wird in den Dialog ein Panel gelegt und hierein ein Label mit dem Text
Hier die Klasse:
Der Aufruf im Programm:
Erwarte habe ich, dass nun ein ein entsprechender Dialog aufgeht, in dem die übergebene Zahl dargestellt wird.
Im Prinzip klappt das auch wunderbar !
Nur habe ich folgendes Problem im Ablauf:
nach dem "setVisible" sieht man zunächst einen leeren Dialog (noch mit der systemeigenen Hintergrundfarbe GRAY, dann wird der Hintergrund weiß und es wird ganz kurz der letzte, zuvor angezeigte Wert dargestellt, ehe dann der eigentliche übergebene Wert kommt.
Das passiert sogar nach dem Neustart des Programm !! :bahnhof:
Im Debugger sehe ich vor dem "setVisible", dass der richtige Wert auf dem Label steht.
Weiterhin habe ich mittlerweile nach dem dispose das "Setzen auf null" hinzugefügt, um sicher zu sein, dass das Objekt vor dem Aufruf des Konstruktor auch wirklich null ist .....
Es gibt in der Anwendung div. weitere Dialoge, die im Prinzip genau so dargestellt werden, allerdings ohne die Klasse "ShowDelayTransparency". Hierbei tritt das Problem augenscheinlich nicht auf ....
Nur - wo kommt der alte Wert her?
Vor allem nach einem Programm-Neustart?
Wird hier iregndwo etwas gecacht? Wenn ja: wo und wie kann ich das verhindern?
Vielleicht sollte ich noch dabei sagen, dass ich den Code der Klasse von einem Kollegen bekommen habe, nur nur ein wenig auf meine Belange angepasst habe.
Würde mich über Tipps freuen!
Gruß
Klaus
ich habe derzeit ein ganz seltsames Problem mit einem von JDialog abgeleiteten eigenen Dialog-Klasse.
Ziel: einen übergebenen Text in einem halbtransparenten Fenster für eine bestimmte Zeit anzuzeigen
hierzu wird in den Dialog ein Panel gelegt und hierein ein Label mit dem Text
Hier die Klasse:
Java:
package com.gselectronic.worker.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/********************************************************************
* Erzeugt ein transparentes Fenster zur Anzeige der Alarmverzögerung
* Beschreibung: Worker-Client
* Autor: nn
********************************************************************/
public class ShowDelayTransparency
extends JDialog
{
private static final long serialVersionUID = 1L;
Frame parentFrame = null;
JPanel pnMain = null;
JLabel lblVerzoegerung = null;
/**
* Konstruktor mit Parameter
* @param frame Der aufrufende Frame
* @param text Zahl der Verzögerung
*/
public ShowDelayTransparency( Frame frame, String text )
{
super( frame, "Alarm-Verzögerung", false );
parentFrame = frame;
pnMain = new JPanel();
setBackground( Color.WHITE );
lblVerzoegerung = new JLabel();
lblVerzoegerung.setBounds( new Rectangle(0,0,750,400) );
// -----------------------------------------------------------------------------
// verfügbare Schriftgröße des Label berechnen
Font labelFont = lblVerzoegerung.getFont();
int stringWidth = lblVerzoegerung.getFontMetrics(labelFont).stringWidth( text );
int componentWidth = lblVerzoegerung.getWidth();
int componentHeight = lblVerzoegerung.getHeight();
// Find out how much the font can grow in width.
double widthRatio = (double)componentWidth / (double)stringWidth;
int newFontSize = (int)(labelFont.getSize() * widthRatio);
// Pick a new font size so it will not be larger than the height of label.
int fontSizeToUse = Math.min( newFontSize, componentHeight );
// Set the label's font size to the newly determined size.
Font font = new Font( "Arial", Font.BOLD, fontSizeToUse );
lblVerzoegerung.setFont( font );
// -----------------------------------------------------------------------------
lblVerzoegerung.setOpaque( true );
lblVerzoegerung.setVerticalAlignment( SwingConstants.CENTER );
lblVerzoegerung.setHorizontalAlignment( SwingConstants.CENTER );
lblVerzoegerung.setBackground( Color.WHITE );
lblVerzoegerung.setForeground( Color.BLACK );
lblVerzoegerung.setText( text );
setResizable( false );
pnMain.setPreferredSize( new Dimension(850,350) );
pnMain.setLayout( new BorderLayout() );
pnMain.setOpaque( false );
pnMain.add( lblVerzoegerung, BorderLayout.CENTER );
getContentPane().add( pnMain );
com.sun.awt.AWTUtilities.setWindowOpacity( this, 0.3f );
setAlwaysOnTop( true );
if (parentFrame != null)
{
Dimension dlgSize = getPreferredSize();
Dimension parentfrmSize = parentFrame.getSize();
Point parloc = parentFrame.getLocation();
setLocation( (parentfrmSize.width - dlgSize.width) / 2 + parloc.x, (parentfrmSize.height - dlgSize.height) / 2 + parloc.y);
}
pack();
} // ShowDelayTransparency
// ########################################
// überschriebene Methoden der Super-Klasse
// ########################################
public void componentResized(ComponentEvent e)
{
// überschrieben
}
public void componentMoved(ComponentEvent e)
{
// überschrieben
}
public void componentShown(ComponentEvent e)
{
// überschrieben
}
public void componentHidden(ComponentEvent e)
{
// überschrieben
}
} // class ShowDelayTransparency
Der Aufruf im Programm:
Java:
{
// transparentes Fenster zur Anzeige der Alarmverzögerungszeit
ShowDelayTransparency sdtAlarmVerzoegerung = null; // globale Varibale
// ...
// this = der parentFrame; sAlarmVerzoegerung Sting mit der Verzögerungszeit in sec., Bsp."512"
sdtAlarmVerzoegerung = new ShowDelayTransparency( this, sAlarmVerzoegerung );
sdtAlarmVerzoegerung.setVisible( true );
} // dieser Block symbolisiert den Timer, in dem das Ganze zyklisch abläuft
// ...
// ggf. an mehreren anderne Stellen, je nach Programmablauf
sdtAlarmVerzoegerung.dispose();
sdtAlarmVerzoegerung = null; // inzwischen hinzugefügt, da anderfalls hier "sdtAlarmVerzoegerung" noch nicht wirklich null zu sein scheint
Erwarte habe ich, dass nun ein ein entsprechender Dialog aufgeht, in dem die übergebene Zahl dargestellt wird.
Im Prinzip klappt das auch wunderbar !
Nur habe ich folgendes Problem im Ablauf:
nach dem "setVisible" sieht man zunächst einen leeren Dialog (noch mit der systemeigenen Hintergrundfarbe GRAY, dann wird der Hintergrund weiß und es wird ganz kurz der letzte, zuvor angezeigte Wert dargestellt, ehe dann der eigentliche übergebene Wert kommt.
Das passiert sogar nach dem Neustart des Programm !! :bahnhof:
Im Debugger sehe ich vor dem "setVisible", dass der richtige Wert auf dem Label steht.
Weiterhin habe ich mittlerweile nach dem dispose das "Setzen auf null" hinzugefügt, um sicher zu sein, dass das Objekt vor dem Aufruf des Konstruktor auch wirklich null ist .....
Es gibt in der Anwendung div. weitere Dialoge, die im Prinzip genau so dargestellt werden, allerdings ohne die Klasse "ShowDelayTransparency". Hierbei tritt das Problem augenscheinlich nicht auf ....
Nur - wo kommt der alte Wert her?
Vor allem nach einem Programm-Neustart?
Wird hier iregndwo etwas gecacht? Wenn ja: wo und wie kann ich das verhindern?
Vielleicht sollte ich noch dabei sagen, dass ich den Code der Klasse von einem Kollegen bekommen habe, nur nur ein wenig auf meine Belange angepasst habe.
Würde mich über Tipps freuen!
Gruß
Klaus