有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java定制圆形皮肤gui

在寻找如何创建圆形界面的起点时。我已经试着查看了文档,也试着查看了Eclipse的其他插件。我刚刚开始用java构建gui,我发现的一切要么是要求我加入一家公司使用他们的产品,要么就是想要几百美元

我只是一个卑微的程序员,正在尝试gui,我正在做的一个个人项目想要一个圆形的gui皮肤


共 (1) 个答案

  1. # 1 楼答案

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

    你可以

    使用^{}改变主窗口的形状,例如

    Circle Frame

    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);
    

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

    你可以

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

    Circle

    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();
            }
    
        }
    
    }
    

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

    你可以

    两者都做

    Circle

    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像素)的空边框来实现的。这会将框架的大小从我们的软剪裁面板边缘推出,但意味着任何溢出的组件都会被剪裁