这个问题之前一直在网上找答案,还是找不到,在这里冒昧的请教一下,就是关于用 java显示一张异形图片,但是不显示承载这个图片的容器窗体,看上去就给人一种只显示了一张图片的感觉,之前想过用JFrame窗体显示,之后让JFrane透明,但是这样的话,上面的图片也透明了,之后看网上有人用了一个com.sun.awt.AWTUtilities的类去实现,不过这个方法貌似也不行,能问一下有什么办法去实现这个问题吗?
用swt
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.sf.feeling.swt.win32.extension.graphics.ImageRegion;
import org.sf.feeling.swt.win32.extension.shell.listener.WindowMoveListener;
import org.sf.feeling.swt.win32.extension.widgets.CMenu;
import org.sf.feeling.swt.win32.extension.widgets.CMenuItem;
import org.sf.feeling.swt.win32.extension.widgets.PopupMenu;
import org.sf.feeling.swt.win32.extension.widgets.listener.MenuAdapter;
import org.sf.feeling.swt.win32.extension.widgets.theme.ThemeRender;
import org.sf.feeling.swt.win32.extension.widgets.theme.VS2005ThemeRender;
import org.sf.feeling.swt.win32.internal.extension.util.ImageCache;
public class CustomShapedWindow {
/**
* @param args
*/
public static void main(String[] args) {
new CustomShapedWindow();
}
public CustomShapedWindow() {
super();
Display display = new Display();
Shell mainShell = new Shell(display);
final Shell shell = new Shell(mainShell, SWT.NO_TRIM);
Image image = ImageCache.getImage("/cup.bmp");
shell.setSize(image.getImageData().width, image.getImageData().height);
shell.setBackgroundImage(image);
shell.setRegion(ImageRegion.calculateControlGraphicsPath(image, image
.getImageData().getPixel(0, 0)));
WindowMoveListener l = new WindowMoveListener(shell, false);
shell.addListener(SWT.MouseDown, l);
shell.addListener(SWT.MouseUp, l);
shell.addListener(SWT.MouseMove, l);
shell.setLayout(new GridLayout());
CMenu menu = new CMenu();
CMenuItem item = new CMenuItem("&Hide", SWT.NONE);
menu.addItem(item);
final ThemeRender theme = new VS2005ThemeRender();
final PopupMenu popupMenu = new PopupMenu(shell, theme);
popupMenu.setMenu(menu);
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
shell.setVisible(false);
}
});
menu.addMenuListener(new MenuAdapter() {
public void menuShown(Event e) {
popupMenu.setTheme(theme);
popupMenu.refresh();
}
});
Monitor primary = Display.getDefault().getPrimaryMonitor();
Rectangle bounds = primary.getBounds();
Rectangle rect = shell.getBounds();
int x = bounds.x + (bounds.width - rect.width) / 2;
int y = bounds.y + (bounds.height - rect.height) / 2;
shell.setLocation(x, y);
shell.setVisible(true);
while (!mainShell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}