001package ca.bc.webarts.widgets; 002 003import java.awt.Color; 004import java.awt.GraphicsDevice; 005import java.awt.GraphicsEnvironment; 006import java.awt.GridBagLayout; 007import java.awt.event.ActionEvent; 008import java.awt.event.ActionListener; 009import java.awt.event.ComponentAdapter; 010import java.awt.event.ComponentEvent; 011import java.awt.event.KeyEvent; 012import java.awt.event.MouseAdapter; 013import java.awt.event.MouseEvent; 014import java.awt.geom.Ellipse2D; 015 016import javax.swing.JFrame; 017import javax.swing.JTextArea; 018import javax.swing.JButton; 019import javax.swing.SwingUtilities; 020 021import ca.bc.webarts.tools.Log ; 022 023 024public class TranslucentCircularFrame extends JFrame 025 026implements ActionListener 027{ 028 final JButton butM = new JButton("Move Me"); 029 final JButton butX = new JButton("Close Me"); 030 int posX=0,posY=0; 031 Log log_ = null; 032 033 034 /** 035 * Creates a frame containing a text area and a button. The frame has a 036 * circular shape and a 75% opacity. 037 */ 038 public TranslucentCircularFrame() 039 { 040 super("Translucent Circular Frame"); 041 log_ = Log.createLog( Log.DEBUG ); 042 log_.debug("TranslucentCircularFrame()","Instantiate"); 043 044 setLayout(new GridBagLayout()); 045 final JTextArea textArea = new JTextArea(3, 50); 046 textArea.setBackground(Color.GREEN); 047 add(textArea); 048 butM.setActionCommand("move"); 049 butX.setActionCommand("close"); 050 butM.addActionListener(this); 051 butX.addActionListener(this); 052 //add(butM); 053 add(butX); 054 setUndecorated(true); 055 056 // set the window's shape in the componentResized method, so 057 // that if the window is resized, the shape will be recalculated 058 addComponentListener(new ComponentAdapter() 059 { 060 Log log_ = null; 061 @Override 062 public void componentResized(ComponentEvent e) 063 { 064 log_ = Log.createLog( Log.DEBUG ); 065 log_.startMethod(); 066 setShape(new Ellipse2D.Double(0, 0, getWidth(), getHeight())); 067 log_.endMethod(); 068 } 069 } ); 070 071 // Now the Mouse listeners so we can drag it around 072 addMouseListener(new MouseAdapter() 073 { 074 Log log_ = null; 075 public void mousePressed(MouseEvent e) 076 { 077 log_ = Log.createLog( Log.DEBUG ); 078 log_.startMethod(); 079 posX=e.getX(); 080 posY=e.getY(); 081 log_.endMethod(); 082 } 083 }); 084 addMouseMotionListener(new MouseAdapter() 085 { 086 Log log_ = null; 087 public void mouseDragged(MouseEvent evt) 088 { 089 log_ = Log.createLog( Log.DEBUG ); 090 log_.startMethod(); 091 //sets frame position when mouse dragged 092 setLocation (evt.getXOnScreen()-posX,evt.getYOnScreen()-posY); 093 log_.endMethod(); 094 } 095 }); 096 097 // make the window translucent 098 setOpacity(0.45f); 099 100 setLocationRelativeTo(null); 101 setSize(400, 250); 102 setDefaultCloseOperation(EXIT_ON_CLOSE); 103 setVisible(true); 104 log_.debug("TranslucentCircularFrame()","END Instantiate"); 105 } 106 107 108 public void actionPerformed(ActionEvent e) 109 { 110 log_.startMethod(); 111 if ("close".equals(e.getActionCommand())) 112 { 113 this.setVisible(false); 114 this.dispose(); 115 } 116 else 117 { 118 } 119 log_.endMethod(); 120 } 121 122 public static void main(String[] args) 123 { 124 125 // Create the GUI on the event-dispatching thread 126 SwingUtilities.invokeLater(new Runnable() 127 { 128 @Override 129 public void run() 130 { 131 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 132 133 // check if the OS supports translucency 134 if (ge.getDefaultScreenDevice().isWindowTranslucencySupported (GraphicsDevice.WindowTranslucency.TRANSLUCENT)) 135 { 136 new TranslucentCircularFrame(); 137 } 138 } 139 } ); 140 } 141}