transparentes Fenster + Speicherverbrauch

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo, ich habe als kleines Projekt mir ein transparentes Fenster gebastelt, welches durch einen actionListener aus einer anderen Klasse aufgerufen wird (soweit normal). Das Problem ist aber, wenn ich das transparente Fenster schließe, wird der Speicherplatz (Ram) nicht mehr freigegeben. An sich ist mir bekannt, das der gc erst einschreitet, wenn keine referenz mehr "verfügbar" ist. Allerdings gibt es keine referenz auf das Fenster von der Aufrufklasse...

Aufruf des Fensters:
Code:
                         try {
				new Test(dbcon.getCourseDescription(kurs));
			} catch (Exception e) {
				// TODO Auto-generated catch block
			e.printStackTrace();
			}


das transparente Fenster (+Hilfsklasse)

Code:
import javax.swing.*;

import sun.java2d.Disposer;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
 
public class Test {
	JScrollPane scroll;
	JPanel p=new JPanel(new BorderLayout());
	Robot robot=new Robot();
	
	public Test(String s)  throws Exception {
		final TransparentFrame frame=new TransparentFrame();
		//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(p);
		frame.addWindowListener(new WindowListener() {

			public void windowOpened(WindowEvent arg0) {
							
			}

			public void windowClosing(WindowEvent arg0) {
				frame.dispose();	
			}

			public void windowClosed(WindowEvent arg0) {
								
			}

			public void windowIconified(WindowEvent arg0) {
								
			}

			public void windowDeiconified(WindowEvent arg0) {
								
			}

			public void windowActivated(WindowEvent arg0) {
								
			}

			public void windowDeactivated(WindowEvent arg0) {
								
			}
			
		});
				
		JTextArea ta = new JTextArea ("test \n test /n test \n");
		ta.setBackground(new Color(200, 200, 200, 100));
		ta.setOpaque(true);
		frame.getContentPane().add(ta);
 
		frame.setBounds(100,100,200,200);
		frame.setVisible(true);
	}
 
	public static void main(String[] args) throws Exception {
		new Test("test");
	}
}
 
class TransparentFrame extends JFrame {
	Robot robot;
	BufferedImage screenImg;
	Rectangle screenRect;
	MyPanel contentPanel=new MyPanel();
	boolean userActivate=false;
	public TransparentFrame() {
		super();
		createScreenImage();
		this.setContentPane(contentPanel);
 
		this.addComponentListener(new ComponentAdapter() {
			public void componentHidden(ComponentEvent e) {}
 
			public void componentMoved(ComponentEvent e) {
				resetUnderImg();
				repaint();
			}
 
			public void componentResized(ComponentEvent e) {
				resetUnderImg();
				repaint();
			}
 
			public void componentShown(ComponentEvent e) {}
		});
 
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
			}
 
			public void windowClosed(WindowEvent e) {
			}
 
			public void windowOpened(WindowEvent e) {
			}
 
			public void windowIconified(WindowEvent e) {
			}
 
			public void windowDeiconified(WindowEvent e) {
			}
 
			public void windowActivated(WindowEvent e) {
				if (userActivate) {
					userActivate=false;
//					  boolean f=TransparentFrame.this.isShowing();
//					  if (f)
						TransparentFrame.this.setVisible(false);
					createScreenImage();
					resetUnderImg();
//					  if (f)
						TransparentFrame.this.setVisible(true);
				}
				else {
					userActivate=true;
				}
			}
 
			public void windowDeactivated(WindowEvent e) {
			}
		});
	}
 
	protected void createScreenImage() {
		try {
			if (robot==null)
				robot=new Robot();
		}
		catch (AWTException ex) {
			ex.printStackTrace();
		}
		Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
		screenRect=new Rectangle(0,0,screenSize.width,screenSize.height);
		screenImg=robot.createScreenCapture(screenRect);
	}
 
/*    public void show() {
		resetUnderImg();
		super.show();
	}*/
 
	public void resetUnderImg() {
		if (robot!=null && screenImg!=null) {
			Rectangle frameRect=getBounds();
			int x=frameRect.x+4;
			contentPanel.paintX=0;
			contentPanel.paintY=0;
			if (x<0) {
				contentPanel.paintX=-x;
				x=0;
			}
			int y=frameRect.y+23;
			if (y<0) {
				contentPanel.paintY=-y;
				y=0;
			}
			int w=frameRect.width-10;
			if (x+w>screenImg.getWidth())
				w=screenImg.getWidth()-x;
			int h=frameRect.height-23-5;
			if (y+h>screenImg.getHeight())
				h=screenImg.getHeight()-y;
			contentPanel.underFrameImg=screenImg.getSubimage(x,y,w,h);
		}
	}
}
 
class MyPanel extends JPanel {
	BufferedImage underFrameImg;
	int paintX=0;
	int paintY=0;
	public MyPanel() {
		super();
		setOpaque(true);
	}
	public void paint(Graphics g) {
		super.paint(g);
	}
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(underFrameImg,paintX,paintY,null);
	}
}

Ich weiß, es ist etwas viel aber ich sehe leider kein Land mehr :(

Danke!
 

8ull23y3

Bekanntes Mitglied
Den Code habe ich nicht gelesen ;) es gibt noch die Möglichkeit den GarbageCollector manuell aufzurufen.

Code:
System.gc();
 

Lim_Dul

Top Contributor
8ull23y3 hat gesagt.:
Den Code habe ich nicht gelesen ;) es gibt noch die Möglichkeit den GarbageCollector manuell aufzurufen.

Code:
System.gc();

Es gibt die Möglichkeit, der VM zu sagen, man möchte, dass der Garbage Collector ausgeführt wird.

Der Garbage Collector wird von Java nicht automatisch gestartet, sobald was freigeben werden kann, sondern erst, wenn die VM meint, es sei dafür Zeit. Und das ist normalerweise eher erst dann der Fall, wenn der Speicher knapp wird. Bei kleinen Programmen kann es sein, dass der Garbage Collector nie aufgerufen wird.
 

thE_29

Top Contributor
Desweiteren bedeutet der Aufruf von System.gc() ja auch net das der GC wirklich startet..

Du teilst der VM nur mit, das du ihn starten möchtest, ob sie es tatsächlich tut, ist ne andere Frage..
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
windl Transparentes / halbtransparentes Fenster AWT, Swing, JavaFX & SWT 1
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
D Transparentes Hauptfenster Events AWT, Swing, JavaFX & SWT 1
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
X Transparentes Overlay AWT, Swing, JavaFX & SWT 3
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
B Swing Transparentes JPanel, Schrift verschmiert AWT, Swing, JavaFX & SWT 22
S Fix für transparentes Systemtray? AWT, Swing, JavaFX & SWT 6
D Transparentes JFrame mit inhalt AWT, Swing, JavaFX & SWT 7
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
0 Transparentes Panel ohne Rahmen AWT, Swing, JavaFX & SWT 5
Kr0e Transparentes Image -> getGraphics AWT, Swing, JavaFX & SWT 8
S Transparentes JPanel auf einem JimiCanvas AWT, Swing, JavaFX & SWT 2
K Popup Deluxe (Transparentes Popup)! AWT, Swing, JavaFX & SWT 8
P Transparentes Window/JFrame (mit SkinLF?) AWT, Swing, JavaFX & SWT 10
M Transparentes gif als extra Klasse auf einen JFrame zeichen AWT, Swing, JavaFX & SWT 17
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
OZAN86 einfaches Fenster öffnen scheitert AWT, Swing, JavaFX & SWT 18
G Zuletzt aktives Fenster, vor dem aktuell aktiven AWT, Swing, JavaFX & SWT 2
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
O JavaFX Fenster scließen AWT, Swing, JavaFX & SWT 4
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
B AWT Fenster schließt nicht AWT, Swing, JavaFX & SWT 2
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
K JavaFX ObservableList + Fenster AWT, Swing, JavaFX & SWT 6
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
N Swing Sorry nicht mal ein Fenster öffnen... AWT, Swing, JavaFX & SWT 19
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
X Swing 2 Fenster (1 im Vordergrund) AWT, Swing, JavaFX & SWT 6
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben