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) {}
}
----------------------------------------------------------
.


Quantcast