我喜欢创建一个看起来像这个图像的java jframe。我已经创建了 具有不同形状(例如三角形,圆形,多边形和一些疯狂的 形状)的jframe。但是问题是很难[99%不可能]创建 这样的图像。我怎么能像这样的jframe。我用这段代码来创建 形状的窗口。
setUndecorated(true); Polygon polygon = new Polygon(); polygon.addPoint(0, 0); polygon.addPoint(100,100); GeneralPath path = new GeneralPath(); path.append(polygon, true); setShape(path);
现在我可以将此图像转换为形状。然后设置setshapes。任何想法吗?还是 有办法使jframe的完全透明和jlable(使图像 完全可见)?
要创建透明窗口,您需要将框架背景色的 Alpha设置为0。这可能是我一段 时间以来看到的最不直观的调用,就好像您对任何其他Swing组件执行此操作一样,您将完全 搞砸绘制过程。
您不想更改窗口的不透明度,因为它会影响 整个窗口,并且其内容均等。
例如…
JWindow frame = new JWindow(); frame.setBackground(new Color(0, 0, 0, 0));
frame.setBackground(new Color(0, 0, 0, 0)); 您不必使用JWindow,但这意味着我不需要 自己修饰它…
您还需要确保添加到窗口的任何内容都是 透明的(opaque = false),以便它不会“隐藏”其下面的 内容……
import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JWindow; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; public class LeafWindow { public static void main(String[] args) { new LeafWindow(); } public LeafWindow() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JWindow frame = new JWindow(); frame.setBackground(new Color(0, 0, 0, 0)); frame.setContentPane(new LeafPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setAlwaysOnTop(true); } }); } public class LeafPane extends JPanel { private BufferedImage leaf; public LeafPane() { setBorder(new CompoundBorder( new LineBorder(Color.RED), new EmptyBorder(0, 0, 250, 0))); try { leaf = ImageIO.read(getClass().getResource("/Leaf.png")); } catch (IOException ex) { ex.printStackTrace(); } setOpaque(false); setLayout(new GridBagLayout()); JButton button = new JButton("Close"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); add(button); } @Override public Dimension getPreferredSize() { return leaf == null ? new Dimension(200, 200) : new Dimension(leaf.getWidth(), leaf.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (leaf != null) { Graphics2D g2d = (Graphics2D) g.create(); g2d.drawImage(leaf, 0, 0, this); g2d.dispose(); } } } }
本示例故意为内容添加线边框,因为您可以看到原始的窗口边界。它还使用aEmptyBorder强制将其 JButton拖到图形上,但这只是一个示例……