package main;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
/**
* Dieses Programm funktioniert einwandfrei.
*
* @author Kevin Riehl
*
*/
@SuppressWarnings("serial")
public class Virtual_Transparency extends JFrame implements Runnable
{
// Attributes
Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // Um Bildschirmdaten zu bekommen
Thread thread;
Robot r;
BufferedImage back = null;
JTextArea area;
int old_x = d.width/4;
int old_y = d.height/4;
boolean crazy = false; // Wenn du das auf true stellst wirst du einen lustigen effekt kennen lernen
// Constructor
public Virtual_Transparency()
{
// Ein paar Eigenschaften vom Frame setzen
super("Virtuelle Transparenz von JFrames"); // Titel des JFrame
setSize(d.width/2,d.height/2); // Größe des JFrame
setLocation(d.width/4,d.height/4); // Positioniert unser JFrame
setLayout(new BorderLayout()); // Setzt das Layout für unser Hauptpanel
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Soll Programm beenden
// Wenn das Fenster geschlossen wird.
snapFirstScreen();
addComponents();
thread = new Thread(this); // Erstellt den Thread
thread.start(); // Startet den Thread
setVisible(true); // Öffnet das Fenster
}
// Constructor Methoden
/**
* Added Componente, z.B. eine JTextArea
*/
public void addComponents()
{
area = new JTextArea()
{
@Override
public void paintComponent(Graphics g) // Überschreibt die Grafik des Components
{
g.drawImage(back,0,0,this); // Zeichnet das Bild
super.paintComponent(g);
}
};
area.setOpaque(false); // Verhindert dass der Hintergrund in der Background Color ist
add(area,"Center"); // Added die TextArea
}
/**
* Schießt uns den ersten Screenshot damit er nicht null ist,
* beim ersten Gezeichne.
*/
public void snapFirstScreen()
{
try
{
r = new Robot(); // Startet unseren >>Robot<< zum Screenshots machen.
}
catch(AWTException e)
{
e.printStackTrace();
}
setLocation(-getSize().width,-getSize().height); // Positioniert das Fenster wieder zurück
snapScreen(); // Schießt einen Screenshot
setLocation(old_x,old_y); // Positioniert das Fenster wieder zurück
}
// Implementierungen
// Implementierung des Threads der aufpasst, falls sich das Fenster bewegt
public void run()
{
while(true) // Endlosschleife, soll ewig gehen, bis das Fenster geschlossen wird
{
if(windowPositionChanged()!=false)
{
old_x = getLocation().x; // Speichert neue Koordinate
old_y = getLocation().y; // Speichert neue Koordinate
snapScreen(); // Schießt einen Screenshot
repaint(); // Zeichnet das Fenster neu
}
waitTime(10); // Es könnte laggen wenn wir das in zukurzen abständen überprüfen und neuzeichnen.
}
}
// Methoden
/**
* Checkt ob das Fenster bewegt wurde oder nicht.
*/
public boolean windowPositionChanged()
{
boolean changed = false;
if(this.getLocation().x==old_x&&this.getLocation().y==old_y)
changed = false;
else
changed = true;
return changed;
}
/**
* Macht einen Screenshot.
*/
public void snapScreen()
{
if(!crazy)
setLocation(-getSize().width,-getSize().height);
back = r.createScreenCapture
(new Rectangle(old_x+6,old_y+25,getSize().width-12,getSize().height-26));
// Die >>+6<< >>+25<< usw... beziehen sich darauf, wie dick das Fenster ist,
// bei meinem Vista jedenfalls hat man keinen Lupenefekt mehr, wenn man das
// Fenster an einer GUI hat, dann stimmen die Linien auf dem Bildschirm,
// und im Fenster überein. Man muss also den Rahmen in Pixel abziehen.
if(!crazy)
setLocation(old_x,old_y);
}
/**
* Wartet einige Zeit einfach ab
*/
public void waitTime(long milis)
{
try
{
Thread.sleep(milis);
}
catch(Exception e)
{
}
}
// Main
public static void main(String[]args)
{
new Virtual_Transparency();
}
}