Ecco la mia opinione su una finestra di livello superiore con la punta morbida e sagomata. Nota: le finestre sagomate utilizzano un'API proprietaria (com.sun.awt.AWTUtilities) e non è garantito che funzioni su JVM non Sun. Tuttavia, in JDK 7 diventa parte della classe Window.
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class MySoftClippedWindow extends JPanel {
public MySoftClippedWindow() {
super();
setLayout(new GridBagLayout());
JButton button = new JButton(new AbstractAction("Close") {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
button.setOpaque(false);
add(button);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
int width = getWidth();
int height = getHeight();
// Create a soft clipped image for the background
BufferedImage img = java_2d_tricker(g2d, width, height);
g2d.drawImage(img, 0, 0, null);
g2d.dispose();
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JWindow w = new JWindow();
Container cp = w.getContentPane();
cp.setLayout(new BorderLayout());
cp.add(new MySoftClippedWindow());
w.setAlwaysOnTop(true);
com.sun.awt.AWTUtilities.setWindowOpaque (w, false);
w.setSize(200, 200);
w.setVisible(true);
}
});
}
/*
* This code is taken from
* http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html
*/
private BufferedImage java_2d_tricker(Graphics2D g2d, int width, int height) {
GraphicsConfiguration gc = g2d.getDeviceConfiguration();
BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
Graphics2D g2 = img.createGraphics();
g2.setComposite(AlphaComposite.Clear);
g2.fillRect(0, 0, width, height);
g2.setComposite(AlphaComposite.Src);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.WHITE);
g2.fillOval(width/4, height/4, width/2, height/2);
g2.setComposite(AlphaComposite.SrcAtop);
g2.setPaint(new GradientPaint(0, 0, Color.RED, 0, height, Color.YELLOW));
g2.fillRect(0, 0, width, height);
g2.dispose();
return img;
}
}
fonte
2010-05-07 20:56:11
Siamo spiacenti, non è quello che sto cercando. Nell'esempio indicato viene visualizzata una finestra con soft-clip ** all'interno ** di un'altra finestra Swing. Sembra, non esiste una soluzione semplice. Immagino che si possa raggiungere la mia intenzione catturando il desktop e coinvolgere quei dati per simulare il taglio morbido, ... Troppo complesso! ;) –
No, non lo è. Entrambe le finestre sono finestre di livello superiore. Prova a eseguire l'esempio SoftClippedWindow e spostare la finestra originale. Il codice sta tentando di mostrare troppe cose contemporaneamente, ma se si ritaglia il codice di riflessione, è possibile ottenere una finestra di livello superiore morbida. –