如何内容一个JPanel都是由半透明的?(How contents are made translu

2019-07-17 22:38发布

我很困惑关于一个JPanel组件的显示。

假设,如果我创建一个自定义的JPanel与0.8f如下的透明度: -

JPanel panel=new JPanel(){
        @Override
        public void paint(Graphics g)
        {
            super.paint(g);
            BufferedImage img=(BufferedImage)createImage(getWidth(),getHeight());
            Graphics2D g2=(Graphics2D) g.create();
            g2.setComposite(AlphaComposite.SrcOver.derive(0.8f));
            g2.drawImage(img,0,0,null);
        }
        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(300,300);
        }
    };

现在,我将其设置为框架的contentPane。

frame.setContentPane(panel);

现在,我的一些按钮添加到它。

    frame.add(new JButton("Click Here"));
    frame.add(new JButton("Click Here"));
    frame.add(new JButton("Click Here"));
    frame.add(new JButton("Click Here"));

1)然后在输出为什么我得到半透明按钮?由于JPanel的是单层的,我先涂上半透明图像,当我overrided其paint的方法,然后添加按钮,按钮不得半透明的,因为他们要过来了。

2)亦掉那些4个按键的只有2是半透明的。为什么会出现这种偏心?

3)如果我还加入了这4个按钮,然后一切就变得translucent.Why前添加一个表?

Object[] names = new Object[] {
             "Title", "Artist", "Album"
         };
         String[][] data = new String[][] {
             { "Los Angeles", "Sugarcult", "Lights Out" },
             { "Do It Alone", "Sugarcult", "Lights Out" },
             { "Made a Mistake", "Sugarcult", "Lights Out" },
             { "Kiss You Better", "Maximo Park", "A Certain Trigger" },
             { "All Over the Shop", "Maximo Park", "A Certain Trigger" },
             { "Going Missing", "Maximo Park", "A Certain Trigger" }
         };
         JTable table = new JTable(data, names);
         frame.add(table); 

4)如果我使用paintComponent(Graphics g)的JPanel中再没有什么是半透明的,我是否添加表或没有或尽可能多的按钮是added.Why?

(我问什么时候应用是run.I知道眼前的输出,当鼠标滑过那些按钮,或者在表中的任何行点击它时会变成不透明,这是由于Swing的绘制机制。)

Answer 1:

1)然后在输出为什么我得到半透明按钮? 由于JPanel的是单层的,我先涂上半透明图像,当我overrided其paint方法,然后添加按钮,按钮不得半透明的,因为他们要过来了。

其实,你涂在按钮上的半透明效果。 paint电话

  • paintComponent
  • paintBorder
  • paintChildren

然后,你画了什么的已经绘(孩子)上的半透明效果。 这将使没有区别,当你添加组件时,Swing会画下许多情况下分量,首先被组件时首先实现了(在屏幕上可以看到)和响应更改脏区(和许多别人的)......骗不了你自己,你必须在这个无法控制...

想想烤漆工艺的分层方法。 首先,你画的背景,那么你画的中间地面,最后,脱颖而出地上,然后你去和泼了...

public class TestTranslucentControls {

    public static void main(String[] args) {
        new TestTranslucentControls();
    }

    public TestTranslucentControls() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage background;

        public TestPane() {
            setLayout(new GridBagLayout());
            try {
                background = ImageIO.read(new File("C:/Users/shane/Dropbox/MegaTokyo/poster.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            add(new JButton("1"));
            add(new JButton("2"));
            add(new JButton("3"));
            add(new JButton("4"));
            add(new JButton("5"));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                Graphics2D g2 = (Graphics2D) g.create();
                g2.setComposite(AlphaComposite.SrcOver.derive(0.25f));
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g2.drawImage(background, x, y, this);
                g2.dispose();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? new Dimension(300, 300) : new Dimension(background.getWidth(), background.getHeight());
        }
    }
}

我想你可能会发现...

  • 执行自定义绘制
  • 绘画在AWT和Swing

有用;)



Answer 2:

一般情况下,你要重写paintComponent()不是paint() 。 这可能是你的透明度问题的原因。 其次,你可能想改变布局。 默认情况下,面板使用的FlowLayout。 你可能想使用BorderLayout的或GridBagLayout的或两者的混合。



文章来源: How contents are made translucent in a JPanel?