我創建了一個JPanel
裏面我把一個JCheckBox
和兩個按鈕:玻璃面板的行爲怪異
當複選框被選中以透明顏色的(alpha = 100)中的的glassPane面板上方被顯示,幷包含標籤顯示String
「載入中...」,問題是,當顯示的glassPane複選框的位置發生變化:
,當我改變框架的尺寸時,glassPane變得不透明,並且在glasspane下可見的所有組件都變得不可見。
,當我將大小更改爲更小的尺寸,的glassPane變化的背景下,並得到變暗,且標籤字符串「加載」變得模糊
這裏是我的代碼這是受Oracle教程啓發GlassPane GlassPane Tutorial
package com.training.test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
class Training extends JFrame
{
JCheckBox changeGlass;
JButton button1, button2;
public Training()
{
setBounds(100, 100, 400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Test Glass Pane");
getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel glass = (JPanel) getGlassPane();
glass.setOpaque(true);
glass.setBackground(new Color(120, 120, 120, 100));
glass.setLayout(new BorderLayout());
glass.add(new JLabel("Loading ..."));
changeGlass = new JCheckBox("Show Glass Pane", false);
changeGlass.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
glass.setVisible(e.getStateChange() == ItemEvent.SELECTED);
}
});
button1 = new JButton("Select");
button2 = new JButton("Change");
getContentPane().add(changeGlass);
getContentPane().add(button1);
getContentPane().add(button2);
glass.addMouseListener(new MouseListener()
{
public void mouseReleased(MouseEvent e)
{
redispatchEvent(e, (JPanel) getContentPane(), glass);
}
public void mousePressed(MouseEvent e)
{
redispatchEvent(e, (JPanel) getContentPane(), glass);
}
public void mouseExited(MouseEvent e)
{
redispatchEvent(e, (JPanel) getContentPane(), glass);
}
public void mouseEntered(MouseEvent e)
{
redispatchEvent(e, (JPanel) getContentPane(), glass);
}
public void mouseClicked(MouseEvent e)
{
redispatchEvent(e, (JPanel) getContentPane(), glass);
}
});
}
public void redispatchEvent(MouseEvent e, JPanel panel, JPanel glass)
{
Point panelPoint = SwingUtilities.convertPoint(glass, e.getPoint(), panel);
Component c = SwingUtilities.getDeepestComponentAt(panel, (int) panelPoint.getX(), (int) panelPoint.getY());
Point componentPoint = SwingUtilities.convertPoint(panel, panelPoint, c);
if (c != null && c.equals(changeGlass))
{
c.dispatchEvent(new MouseEvent(c, e.getID(), e.getWhen(), e.getModifiers(), (int) componentPoint.getX(), (int) componentPoint.getY(), e.getClickCount(), e
.isPopupTrigger()));
}
else
{
e.consume();
}
}
}
任何人都可以糾正我我做錯了什麼?
搖擺不做半透明,我很害怕。這有一些技巧,但我必須查看它們。 – 2014-10-18 17:10:32
@HovercraftFullOfEels因此透明glassPane是不可能的,因爲它與JFrame的setOpacity一起工作,我發現一個解決方案是準備png圖片與較低的alpha並添加圖片作爲imageIcon標籤,但我不知道如何拉伸圖片採取所有glassPane空間。 – 2014-10-18 17:37:51
我相信這是可能的,但它需要一些技巧(當你需要它們時@camickr或MadProgrammer在哪裏?)。也許使用JLayer會更好。我現在正在查看。 – 2014-10-18 17:38:34