我对 JPanel 中组件的显示感到困惑。
假设如果我创建一个半透明度为 0.8f 的自定义 JPanel,如下所示:-
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 是单层的,当我覆盖它的paint
方法然后添加按钮时,我首先绘制了半透明图像,所以按钮不能是半透明的,因为它们应该越过它。
2)这4个按钮中也只有2个是半透明的。为什么会有这样的偏见?
3)如果我在添加这 4 个按钮之前还添加了一个表格,那么一切都会变成半透明的。为什么?
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 则没有任何东西是半透明的,无论我是否添加表格或添加了多少按钮。为什么?
(我问的是应用程序运行时的即时输出。我知道当鼠标悬停在这些按钮上或单击表格中的任何行时,它会变得不透明,这是由于 Swing 的绘画机制。)