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:
das transparente Fenster (+Hilfsklasse)
Ich weiß, es ist etwas viel aber ich sehe leider kein Land mehr
Danke!
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!