Swing:如何制作带有柔和边框的非矩形窗口?

时间:2009-06-13 17:14:51

标签: java user-interface swing awt effects

如何在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 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

你读过这篇文章:

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

它提到了软剪辑和您之前提到的文章,但也包含了一些实现软剪裁窗口的源代码,直接链接在这里:

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

这应该为您提供可能的解决方案。

答案 2 :(得分:-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>
*/