Качели: Как сделать непрямоугольные окна с мягкими бордюрами? - PullRequest
6 голосов
/ 13 июня 2009

Как я могу сделать непрямоугольные окна с мягкими границами в 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.

Ответы [ 3 ]

3 голосов
/ 08 мая 2010

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

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

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

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

http://www.pushing -pixels.org / WP-содержание / добавления / 2008/03 / softclippedwindow.java

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

...