如何在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 :(得分: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>
*/