2009-06-13 12 views
6

Come posso creare finestre non rettangolari con bordi sfumati in Java?
I bordi sfumati (noti anche come soft clipping) sono bordi senza artefatti di aliasing.Altalena: come creare finestre non rettangolari con bordi sfumati?

Ho cercato molto sul Web e ho trovato diversi post su finestre non rettangolari e/o non rettangolari.

L'argomento "bordo morbido" è confuso. Sembra che le informazioni che ho trovato trattano con l'applicazione di bordi sfumati a componenti che sono all'interno di un altro componente Java.

Ma, posso, o non posso, applicare bordi morbidi a JWindow a forma personalizzata che è posizionato solo sul desktop?

mi primely riferisco al seguente post:
http://today.java.net/pub/a/today/2008/03/18/translucent-and-shaped-swing-windows.html

Quando si tratta di soft clipping, in avanti articolo per
http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html
Ma qui, soft clipping su un oggetto Graphics2D esistente è descritto.

risposta

0

Hai letto questo articolo:

http://www.pushing-pixels.org/?p=272

Menziona soft clipping e gli articoli precedenti che hai citato, ma include anche qualche codice sorgente per implementare una finestra ritagliata morbido, il link diretto è qui:

http://www.pushing-pixels.org/wp-content/uploads/2008/03/softclippedwindow.java

Questo dovrebbe fornirvi una possibile soluzione per quello che si vuole fare.

+0

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! ;) –

+0

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. –

-1
import java.awt.*; 

public class First extends Applet 
    { 
    public void paint(Graphics g) 
      { 
      g.drawRect(100,50,500,800); 
      } 
    } 
/*<Applet code="First.class"height=500 width=500> 
    </Applet> 
*/ 
3

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; 
    } 
} 
Problemi correlati