Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to have a translucent windows in java 7 including a title bar?

Related to this question: Is The Java Tutorials Translucent Window example giving trouble to those playing with jdk7?

with jdk1.6.0_26 I seem to be able to apply translucency to a JFrame, but not so with jre7:

NativeException: java.awt.IllegalComponentStateException: The frame is decorated

ex (jruby scripting java, works jdk1.6 not with jdk7 though):


require 'java'

class MouseDraw

  def self.go
    java_import 'javax.swing.JFrame'
    java_import 'com.sun.awt.AWTUtilities'

    f = JFrame.new
    AWTUtilities.set_window_opacity(f, 0.5)
    f.set_size 200,200
    f.show
  end

end
MouseDraw.go

So my question is "is it possible to have a translucent title bar in jdk7" (I would like a transparent window I'm creating to be draggable/resizable)

like image 890
rogerdpack Avatar asked Sep 08 '11 20:09

rogerdpack


2 Answers

Java 7 introduced Window.setOpacity() to do what the unofficial class AWTUtilities did in Java 6.

Unfortunately it's documented not to work with decorated windows:

The following conditions must be met in order to set the opacity value less than 1.0f:

  • The TRANSLUCENT translucency must be supported by the underlying system
  • The window must be undecorated (see Frame.setUndecorated(boolean) and Dialog.setUndecorated(boolean))
  • The window must not be in full-screen mode (see GraphicsDevice.setFullScreenWindow(Window))

(Emphasis mine)

like image 81
Joachim Sauer Avatar answered Sep 29 '22 17:09

Joachim Sauer


Fascinatingly, if you add

JFrame.setDefaultLookAndFeelDecorated(true);

Then it allows you to have a draggable, with title bar JFrame (it just uses the ugly java look and feel).

ref: Pass mouse events to applications behind from a Java UI

Now that is weird.

Also note that you can "fake" the old behavior using per pixel transparency, see http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html

so you can have the old behavior in both java 6 and 7, but you'd have to special case the code around it and do it one way for one, one way for the other, possibly...

like image 42
rogerdpack Avatar answered Sep 29 '22 18:09

rogerdpack