Darstellungsproblem mit Dialog

VfL_Freak

Top Contributor
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:
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
 
Moin,

gute Frage .... war so drin - vermutllich, weil unsprünglich von JFrame abgeleitet wurde, da mussten die zwingend überschrieben werden.

Habe alle vier Methoden jetzt mal rausgenommen und dann erneut getestet, ändert aber leider nichts ;(

Gruß
Klaus

[EDIT]
Vielleicht sollte ich auch noch erwähnen, dass es bei der nicht-opaken Darstellung genau so ist !
[/EDIT]
 
Zuletzt bearbeitet:
Ist es möglich das in einem KSKB darzustellen?

Hinweis: Bei mittiger Postionierung des Dialogs über dem Frame hilft
Code:
setLocationRelativeTo(frame)
. Damit spart man sich die Berechnung und falls
Code:
frame==null
wird der Dialog einfach mittig auf dem Bildschirm angezeigt.
 
Moin Michael,

Ist es möglich das in einem KSKB darzustellen?
Muss ich mal schauen, ob ich das hinbekomme. Leider ist die aufrufende Klasse mein mainFrame und breits fast 30000 Zeilen groß.
Kann ich aber eh' erst am Montag versuchen, da ich heute nicht mehr in die Firma komme und zu Hause keine Sourcen habe.

Hinweis: Bei mittiger Postionierung des Dialogs über dem Frame hilft
Code:
setLocationRelativeTo(frame)
. Damit spart man sich die Berechnung und falls
Code:
frame==null
wird der Dialog einfach mittig auf dem Bildschirm angezeigt.
Ja, ich weiß, hatte ich auch erst drin. Nur gibt es bei uns ein Reihe von Arbeitsplätzen (auch bei meinem Chef), die bis zu drei Monitore angeschlossen haben. Und wenn er nun irgendwann das Hauptfenster des Programms auf einen anderen als den ersten Monitor schiebt, dann will er natürlich dieses aufpopende opake Fenster weiterhin zentriert auf diesem Monitor sehen und nicht weiterhin auf dem, bei dem das Programm gestartet wurde .....

Schönes WE!
tschüss
Klaus
 
Muss ich mal schauen, ob ich das hinbekomme.
Wäre halt hilfreich. Mir selbst ist das Phänomen noch nicht untergekommen.
Ja, ich weiß, hatte ich auch erst drin. Nur gibt es bei uns ein Reihe von Arbeitsplätzen (auch bei meinem Chef), die bis zu drei Monitore angeschlossen haben. Und wenn er nun irgendwann das Hauptfenster des Programms auf einen anderen als den ersten Monitor schiebt, dann will er natürlich dieses aufpopende opake Fenster weiterhin zentriert auf diesem Monitor sehen und nicht weiterhin auf dem, bei dem das Programm gestartet wurde .....
Der Dialog wird doch immer mittig über dem Frame angezeigt, egal auf welchem Monitor der Frame ist?
 
Moin,

ja, mit dem KSKB wird das derzeit nix, da sich die Prioritäten von meinem Chef schon wieder verschoben haben ... 🙁

Na ja, dann muss er da erst mal so mit leben .....

Danke und Gruß
Klaus
 
Moin,

Was mir noch auffällt ist dass der Code eine Exception wirft, weil dein Dialog nicht undecorated ist. (Java 7)
hmm ... wir haben hier nur einen einzigen Test-Rechner mit Java7 laufen (sonst nur Java6) und dort tritt keine Exception auf :bahnhof:

Aber Danke für den Hinweis, werde ich mal in Auge behalten !

Gruß
Klaus
 

Zurück
Oben