2014-10-18 73 views
2

我創建了一個JPanel裏面我把一個JCheckBox和兩個按鈕:玻璃面板的行爲怪異

enter image description here

當複選框被選中以透明顏色的(alpha = 100)中的的glassPane面板上方被顯示,幷包含標籤顯示String「載入中...」,問題是,當顯示的glassPane複選框的位置發生變化:

enter image description here

,當我改變框架的尺寸時,glassPane變得不透明,並且在glasspane下可見的所有組件都變得不可見。

enter image description here

,當我將大小更改爲更小的尺寸,的glassPane變化的背景下,並得到變暗,且標籤字符串「加載」變得模糊

enter image description here

這裏是我的代碼這是受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(); 
     } 
    } 
} 

任何人都可以糾正我我做錯了什麼?

+0

搖擺不做半透明,我很害怕。這有一些技巧,但我必須查看它們。 – 2014-10-18 17:10:32

+0

@HovercraftFullOfEels因此透明glassPane是不可能的,因爲它與JFrame的setOpacity一起工作,我發現一個解決方案是準備png圖片與較低的alpha並添加圖片作爲imageIcon標籤,但我不知道如何拉伸圖片採取所有glassPane空間。 – 2014-10-18 17:37:51

+1

我相信這是可能的,但它需要一些技巧(當你需要它們時@camickr或MadProgrammer在哪裏?)。也許使用JLayer會更好。我現在正在查看。 – 2014-10-18 17:38:34

回答

4

檢查出Backgrounds With Transparency的問題的可能原因和幾個解決方案。基本上,因爲您使用的是透明背景,所以您需要確保自己繪製玻璃板的背景。

所以,我會創建一個自定義面板作爲您的玻璃窗格,以便您可以管理背景的繪畫。然後,將此面板設置爲框架的玻璃窗格。

+0

1+,請參閱我對原始問題的評論 - 你回答了我的祈禱! – 2014-10-18 17:54:15

+0

@HovercraftFullOfEels,謝謝:) – camickr 2014-10-18 18:08:45

+0

@camickr Omg你真的很棒,謝謝你的幫助。 – 2014-10-18 18:53:07