定制圆皮gui

在寻找如何创建圆形界面的起点。 我已经尝试查看文档并尝试查看Eclipse的其他插件。 我刚刚开始使用java构建gui,我找到的一切要么是要求我成为公司的一部分才能使用他们的产品或想要几百美元。

我只是一个谦虚的程序员,我在gui的手上试着,我正在做的个人项目需要一个圆形的gui皮肤。

至少有两种方法可以达到这个目的……

你可以…

使用JFrame#setShape来改变主窗口的形状,例如……

圆框

 JFrame frame = new JFrame("Testing"); frame.getContentPane().setBackground(Color.RED); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridBagLayout()); frame.add(new JLabel("Boo!")); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setUndecorated(true); frame.setShape(new Ellipse2D.Double(0, 0, 200, 200)); frame.setVisible(true); 

这很简单,但坦率地说,看起来很糟糕。 使用这种技术无法实现软剪裁以平滑边缘……

你可以…

创建一个透明窗口并“伪造”形状……

圈

 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.RenderingHints; import java.awt.geom.Ellipse2D; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class CircleUI { public static void main(String[] args) { new CircleUI(); } public CircleUI() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setUndecorated(true); frame.setBackground(new Color(0, 0, 0, 0)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new CirclePane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class CirclePane extends JPanel { public CirclePane() { setOpaque(false); setLayout(new GridBagLayout()); add(new JLabel("Boo!")); setBackground(Color.RED); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g2d.setColor(Color.RED); g2d.fill(new Ellipse2D.Double(0, 0, getWidth() - 1, getHeight() - 1)); g2d.dispose(); } } } 

可以说,它可以产生更好看的结果,但是允许您显示超出形状的组件(允许它们溢出),因此您需要能够管理内容以确保不会发生这种情况……

你可以…

两者都做……

圈

 JFrame frame = new JFrame("Testing"); frame.setUndecorated(true); frame.setBackground(new Color(0, 0, 0, 0)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // This is the secret here... JPanel content = new JPanel(new BorderLayout()); content.setOpaque(false); content.setBorder(new EmptyBorder(1, 1, 1, 1)); content.add(new CirclePane()); frame.setContentPane(content); frame.pack(); int width = frame.getWidth(); int height = frame.getHeight(); frame.setShape(new Ellipse2D.Double(0, 0, width, height)); frame.setLocationRelativeTo(null); frame.setVisible(true); 

这样做是使用第一个示例中的setShape方法,使用第二个示例中的软剪辑并将它们组合在一起。 这是通过使用另一个JPanel充当我们的“假”形状面板的容器并提供非常小的(1像素)空边框来完成的。 这会将框架的大小从我们的软剪裁面板的边缘推出,但意味着任何溢出它的组件都会被剪裁……

在JFrame上调用setOpacity方法。 更多细节: http : //java-demos.blogspot.com/2012/09/how-to-create-shaped-jframes-in-java.html

Java 6和Java 7的其他选项: 单击此处查看其他解决方案中的示例

 JFrame frame = new JFrame(); frame.setUndecorated(true); AWTUtilities.setWindowShape(frame, new Ellipse2D.Double(0, 0, 100, 100)); 

不要太粗鲁,但你真的可以找到这个,如果你花了5分钟谷歌搜索或搜索Stack Overflow …

如果你真的想学习Java GUI,你应该花一些时间研究AWT,Swing或JavaFX,用于GUI工作的核心Java库,以及JFrame和JWindow等基本对象,以及创建菜单,按钮,ActionListeners和布局。