【问题标题】:Set JFrame background transparent but show contents设置 JFrame 背景透明但显示内容
【发布时间】:2015-12-11 00:50:21
【问题描述】:

我正在寻找一些解决方案,将不透明的空 JFrame 背景变为透明(无半透明),但显示按钮容器等摆动组件... 这里是一个例子。

默认的 JFrame

类似,这里禁用背景

【问题讨论】:

    标签: java swing netbeans jframe


    【解决方案1】:

    这是一个简单的两步过程...

    首先,你需要制作一个透明的框架...

    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 TestPane());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    

    对于您想要透视的每个组件,您需要确保将其设置为透明,例如...

    public class TestPane extends JPanel {
    
        public TestPane() {
            setOpaque(false);
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(4, 4, 4, 4);
            add(new JLabel("Product"), gbc);
            gbc.gridy++;
            add(new JLabel("Company"), gbc);
            gbc.gridy++;
            add(new JLabel("Phone"), gbc);
    
            gbc.gridx++;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JTextField(10), gbc);
            gbc.gridy++;
            add(new JComboBox(), gbc);
            gbc.gridy++;
            add(new JTextField(10), gbc);
    
            JPanel buttons = new JPanel();
            buttons.setOpaque(false);
            buttons.add(new JButton("Add"));
            buttons.add(new JButton("Update"));
            buttons.add(new JButton("Delete"));
            gbc.gridx = 0;
            gbc.gridy++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(buttons, gbc);
    
            gbc.gridy++;
            JPanel filler = new JPanel();
            filler.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10)));
            add(filler, gbc);
    
            gbc.gridy++;
            gbc.fill = GridBagConstraints.BOTH;
            add(new JScrollPane(new JTable(new DefaultTableModel(new String[]{"Product", "Company", "Phone"}, 0))), gbc);
    
        }
    
    }
    

    还有一个可运行的例子……

    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.CompoundBorder;
    import javax.swing.border.EmptyBorder;
    import javax.swing.border.LineBorder;
    import javax.swing.table.DefaultTableModel;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    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 TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            public TestPane() {
                setOpaque(false);
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.insets = new Insets(4, 4, 4, 4);
                add(new JLabel("Product"), gbc);
                gbc.gridy++;
                add(new JLabel("Company"), gbc);
                gbc.gridy++;
                add(new JLabel("Phone"), gbc);
    
                gbc.gridx++;
                gbc.gridy = 0;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                add(new JTextField(10), gbc);
                gbc.gridy++;
                add(new JComboBox(), gbc);
                gbc.gridy++;
                add(new JTextField(10), gbc);
    
                JPanel buttons = new JPanel();
                buttons.setOpaque(false);
                buttons.add(new JButton("Add"));
                buttons.add(new JButton("Update"));
                buttons.add(new JButton("Delete"));
                gbc.gridx = 0;
                gbc.gridy++;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                add(buttons, gbc);
    
                gbc.gridy++;
                JPanel filler = new JPanel();
                filler.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10)));
                add(filler, gbc);
    
                gbc.gridy++;
                gbc.fill = GridBagConstraints.BOTH;
                add(new JScrollPane(new JTable(new DefaultTableModel(new String[]{"Product", "Company", "Phone"}, 0))), gbc);
    
            }
    
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.dispose();
            }
    
        }
    
    }
    

    这也是“假”半透明框架的好方法......

    public class TestPane extends JPanel {
    
        //...
    
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(getBackground());
            g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.dispose();
        }
    
    }
    

    【讨论】:

    • 好吧,在你发布答案之前我找到了一个简单的方法 xd,它只是设置了 undecurated 和 setBackground(0,0,0,0) 并且没有设置不透明的面板......但无论如何谢谢:P
    猜你喜欢
    • 2013-04-08
    • 2012-07-27
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2018-12-25
    • 2016-10-09
    相关资源
    最近更新 更多