Transparent JDesktopPane
I was so very happy today, because I had my UI looking just really blody
flash. Then I tried moving a JInternalFrame, and the whole house of
cards tumbled down.
My whole L&F depends on having a JPanel in the background of an MDI
form. That background panel has a tiled image of a cute little
watermark. Buttons on the left, JDesktop taking up the rest of the
space, with JInternal frames popping up as required.
As I said in my opening paragraph, the problem is that moving the
JInternalFrames about leaves a mess behind on the JDesktopPane.
I've put together a simple class that shows my problem exactly. It'll
wrap, but it's also available for download at...
http://www.webber.com.au/pub/TransparentMDI.java
I'd greatly appreciate any thought on this. The sample code is below.
TIA,
Luke
------------------------------------------------------------
package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
* A sample of problems encountered with transparent JDesktopPanes
*
* If pnlLeft isn't added, the red background from pnlMain doesn't
* even show though, but that's not the biggest problem.
* Moving the JInternalFrame around (WinXP, JDK1.5.0_07), makes one
* hell of a mess. OTOH, resizing the internal frame works just fine,
* even removing the artifacts left by previous moves.
*/
public class TransparentMDI extends JFrame implements WindowListener
{
JDesktopPane desktop = new JDesktopPane();
public static void main(String[] args)
{
new TransparentMDI().setVisible(true);
}
public TransparentMDI()
{
super("Transparent Desktop Test");
Container cp = getContentPane();
JPanel pnlMain = new JPanel(new BorderLayout());
pnlMain.setBackground(Color.RED);
JPanel pnlLeft = new JPanel(new BorderLayout());
pnlLeft.setOpaque(false);
pnlLeft.add(new JLabel("JDK "+System.getProperty("java.version")),
BorderLayout.NORTH);
pnlMain.add(pnlLeft, BorderLayout.WEST);
// Make the desktop semi-transparent
Color db = new Color(0,0,0, 32);
desktop.setBackground(db);
desktop.setOpaque(false);
pnlMain.add(desktop, BorderLayout.CENTER);
JInternalFrame jif = new JInternalFrame("Internal Frame", true, true);
jif.setBounds(0, 0, 300, 300);
Container jifcp = jif.getContentPane();
jifcp.setLayout(new BorderLayout());
jifcp.add(new JLabel("Move me", JLabel.CENTER), BorderLayout.CENTER);
jif.setVisible(true);
desktop.add(jif);
cp.setLayout(new BorderLayout());
cp.add(pnlMain, BorderLayout.CENTER);
addWindowListener(this);
pack();
setExtendedState(MAXIMIZED_BOTH);
}
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
----------------------------------------------------------