2009-06-13 20 views
6

¿Cómo podría hacer ventanas no rectangulares con bordes suaves en Java?
Los bordes suaves (también conocidos como recorte suave) son bordes sin artefactos aliasing.Columpio: ¿Cómo hacer ventanas no rectangulares con bordes suaves?

He buscado mucho en la web y he encontrado varias publicaciones sobre ventanas translúcidas y/o no rectangulares.

El tema "borde suave" es confuso. Parece que la información que encontré trata con la aplicación de bordes suaves al componente que son dentro de otros componentes de Java.

Pero, puedo o no puedo que aplicar bordes suaves para moldearon a medida que es JWindow coloca justo en el escritorio?

estoy refiriendo a primely siguiente mensaje:
http://today.java.net/pub/a/today/2008/03/18/translucent-and-shaped-swing-windows.html

Cuando se trata de softclipping, los delanteros artículo para
http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html
Pero aquí, se describe el recorte suave en un objeto Graphics2D existente.

Respuesta

0

¿Ha leído este artículo:

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

Menciona softclipping y los artículos anteriores que usted ha mencionado, pero también incluye un código fuente para implementar una ventana recortada suave, el enlace directo está aquí:

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

que usted debe proporcionarle una posible solución para lo que quiere hacer.

+0

Lo siento, no es lo que estoy buscando. El ejemplo dado muestra una ventana recortada de forma suave ** dentro ** de otra ventana de Swing. Parece que no hay una solución simple. Supongo que uno podría lograr mi intención capturando el escritorio e involucrando esa información para simular un recorte suave, ... ¡Demasiado complejo! ;) –

+0

No, no lo es. Ambas ventanas son ventanas de nivel superior. Intenta ejecutar el ejemplo de SoftClippedWindow y mover la ventana original. El código está tratando de mostrar demasiadas cosas a la vez, pero si recorta el código de reflexión, puede obtener una ventana de nivel superior recortada. –

-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

Aquí está mi opinión sobre una ventana de nivel superior con forma de clip suave. Nota: las ventanas con forma utilizan una API patentada (com.sun.awt.AWTUtilities) y no se garantiza que funcione en JVM que no sean de Sun. Sin embargo, en JDK 7 se convierte en parte de la clase 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; 
    } 
} 
Cuestiones relacionadas