2009-06-13 5 views
6

Как я могу сделать непрямоугольные окна с мягкими границами в Java?
Мягкие границы (также известные как мягкие обрезки) являются границами без артефактов наложения.Качели: как сделать не прямоугольные окна с мягкими границами?

Я искал в Интернете много и нашел несколько сообщений о полупрозрачных и/или непрямоугольных окнах.

Тема «Мягкая граница» сбивает с толку. Кажется, что информация, которую я нашел, имеет дело с применением мягких границ для компонента, которые являются внутри других компонентов Java.

Но, Могу ли я, или я не могу применить мягкие границы к пользовательской форме JWindow, которая является , размещенной только на рабочем столе?

Я превосходно со ссылкой на следующее сообщение:
http://today.java.net/pub/a/today/2008/03/18/translucent-and-shaped-swing-windows.html

Когда дело доходит до мягкого клиппинга, статья вперед к
http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html
Но здесь, мягкое отсечение на существующем объекте Graphics2D описывается.

ответ

0

Вы читали эту статью:

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

Он упоминает мягкую вырезку и предыдущие статьи вы упомянули, но также включает в себя некоторые исходный код для реализации мягкого обрезается окна, прямая ссылка здесь:

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

Это должно предоставить вам возможное решение для того, что вы хотите сделать.

+0

Извините, это не то, что я ищу. В приведенном примере отображается окно с мягким обрезанием ** внутри ** другое окно Swing. Кажется, нет простого решения. Я предполагаю, что можно достичь моего намерения, захватив рабочий стол и привлечь эти данные для имитации мягкого отсечения, ... Слишком сложно! ;) –

+0

Нет, это не так. Оба окна - это окна верхнего уровня. Попробуйте запустить пример SoftClippedWindow и переместите исходное окно. Код пытается показать слишком много вещей сразу, но если вы обрезаете код отражения, вы можете получить мягкое обрезанное окно верхнего уровня. –

-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

Вот мой взгляд на мягкое, образное, верхнее окно. Примечание. В форматированных окнах используется собственный API (com.sun.awt.AWTUtilities) и не гарантируется работа на не-Sun JVM. Однако в JDK 7 он становится частью класса 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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^