【发布时间】:2012-12-21 12:25:41
【问题描述】:
我对 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 是单层的,当我覆盖其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)如果我为 JPanel 使用paintComponent(Graphics g),那么无论我是否添加表格或添加了多少按钮,都不会是半透明的。为什么?
(我问的是应用程序运行时的即时输出。我知道当鼠标悬停在这些按钮上或单击表格中的任何行时,它会变得不透明,这是由于 Swing 的绘画机制造成的。)
【问题讨论】:
-
1)
JPanel panel=new JPanel(){ @Override public void paint(Graphics g) { super.paint(g);应该是JPanel panel=new JPanel(){ @Override public void paintComponent(Graphics g) { super.paintComponent(g);2) 为了尽快获得更好的帮助,请发布 SSCCE。 -
另外,不要忘记
dispose()任何您创建的Graphics对象。 -
@AndrewThompson :请查看我更新的问题。最后一点 4。
-
我编译了你的源代码,所有的按钮都是半透明的。也许这个教程会帮助http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html