2015-03-25 34 views
1

我試圖做的是有一個半透明的背景,但完全不透明的數字小時鐘的阿爾法。任何使用setAlpha()方法都會導致shell及其中的所有內容變得半透明。在SWT中,是否有辦法強制標籤具有Alpha = 255,即使Shell的Alpha = 100?如果沒有,有沒有辦法在其他一些相對簡單的GUI庫中這樣做?讓SWT標籤不繼承外殼

public class SystemClock { 
    Label labelHours; 
    Label labelMinutes; 
    Label labelSeconds; 
    Label labelMeridian; 
    boolean pause = false; 
    Display display; 
    Runnable repeat = new Runnable(){ 
     public void run(){ 
       if(!shlClock.isDisposed()) 
        pullClock(); 
        display.timerExec(1000, this); 
     } 
    }; 
    protected Shell shlClock; 

    public static void main(String[] args) { 
     try { 
      SystemClock window = new SystemClock(); 
      window.open(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void open() { 
     display = Display.getDefault(); 
     createContents(); 
     shlClock.open(); 
     shlClock.layout(); 
     repeatClock(); 
     while (!shlClock.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
    } 

    protected void createContents() { 
     shlClock = new Shell(SWT.NO_TRIM | SWT.ON_TOP); 
     shlClock.setModified(true); 
     shlClock.setBackgroundMode(SWT.INHERIT_FORCE); 
     shlClock.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyReleased(KeyEvent e) { 
       if(e.keyCode == SWT.ESC){ 
        System.exit(0); 
       }else if(e.keyCode == 80 || e.keyCode == 112){ 
        pause = !pause; 
         if(pause){ 
          display.timerExec(-1,repeat); 
         }else{ 
          display.timerExec(100,repeat); 
         } 
       } 
      } 
     }); 
     shlClock.setBackground(SWTResourceManager.getColor(0, 0, 0)); 
     shlClock.setSize(95, 25); 
     shlClock.setAlpha(180); 
     shlClock.setLocation((1366-95),250); 
     shlClock.setText("Clock"); 
     shlClock.setLayout(null); 

     Region overShell = new Region(); 
     Region minuteShell = new Region(); 
     Region hoursShell = new Region(); 
     Region secondShell = new Region(); 
     Region colon1Shell = new Region(); 
     Region colon2Shell = new Region(); 
     Region meridianShell = new Region(); 

     Rectangle overShellRec = new Rectangle(0,0,95,25); 
     Rectangle overShellRecSub = new Rectangle(2,2,91,21); 
     Rectangle innerRec = new Rectangle(5,5,86,16); 


     overShell.add(overShellRec); 
     overShell.subtract(overShellRecSub); 
     overShell.add(innerRec); 

     shlClock.setRegion(overShell); 
     Rectangle size = overShell.getBounds(); 
     shlClock.setSize(size.width, size.height); 

     Label labelColonHoursMinutes = new Label(shlClock, SWT.ALPHA); 
     labelColonHoursMinutes.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); 
     labelColonHoursMinutes.setBounds(20, 5, 3, 15); 
     labelColonHoursMinutes.setText(":"); 

     Label labelColonMinutesSeconds = new Label(shlClock, SWT.ALPHA); 
     labelColonMinutesSeconds.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); 
     labelColonMinutesSeconds.setBounds(41, 5, 3, 15); 
     labelColonMinutesSeconds.setText(":"); 

     labelMinutes = new Label(shlClock, SWT.NONE); 
     labelMinutes.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); 
     labelMinutes.setBounds(26, 5, 14, 12); 
     labelMinutes.setText("00"); 

     labelHours = new Label(shlClock, SWT.RIGHT); 
     labelHours.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); 
     labelHours.setBounds(5, 5, 14, 12); 
     labelHours.setText("00"); 

     labelSeconds = new Label(shlClock, SWT.NONE); 
     labelSeconds.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); 
     labelSeconds.setBounds(47, 5, 14, 12); 
     labelSeconds.setText("00"); 

     labelMeridian = new Label(shlClock, SWT.NONE); 
     labelMeridian.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); 
     labelMeridian.setBounds(65, 5, 21, 12); 
     labelMeridian.setText("AM"); 

    } 


public void pullClock(){ 
     long currentTime = System.currentTimeMillis(); 
     int hours; 
     int minutes; 
     int seconds; 
     String hoursStr; 
     String minutesStr; 
     String secondsStr; 
     String meridian;    
      currentTime/=1000; 
      seconds = (int)currentTime%60; 
      currentTime/=60; 
      minutes = (int)currentTime%60; 
      currentTime/=60; 
      hours = (int)currentTime%24; 
      hours -=4; 

      switch(hours){ 
       case -4: hoursStr="8"; meridian = "PM"; break; 
       case -3: hoursStr="9"; meridian = "PM"; break; 
       case -2: hoursStr="10"; meridian = "PM"; break; 
       case -1: hoursStr="11"; meridian = "PM"; break; 
       case 0: hoursStr="12"; meridian = "AM"; break; 
       case 12: hoursStr="12"; meridian = "PM"; break; 
       case 13: hoursStr="1"; meridian = "PM"; break; 
       case 14: hoursStr="2"; meridian = "PM"; break; 
       case 15: hoursStr="3"; meridian = "PM"; break; 
       case 16: hoursStr="4"; meridian = "PM"; break; 
       case 17: hoursStr="5"; meridian = "PM"; break; 
       case 18: hoursStr="6"; meridian = "PM"; break; 
       case 19: hoursStr="7"; meridian = "PM"; break; 
       default: hoursStr=String.valueOf(hours); meridian = "AM"; 
      } 
      secondsStr=String.valueOf(seconds); 
      minutesStr=String.valueOf(minutes); 
      labelHours.setText(hoursStr); 
      labelMinutes.setText((minutes<10) ? "0"+minutesStr:minutesStr); 
      labelSeconds.setText((seconds<10) ? "0"+secondsStr:secondsStr); 
      labelMeridian.setText(meridian); 
     } 
public void repeatClock(){ 
    display.timerExec(10, repeat); 
    } 
} 

我與區域試驗,因爲這是大多數的我已經能夠找到類似的問題已經建議,但它似乎並不可能將標籤貼在透明段。

回答

0

由於4.5 M5 (search for 'transparent'),SWT支持具有透明背景對照。如果您將控件背景設置爲透明,則其父項的顏色將可見。

label.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT)); 

欲瞭解更多詳情,請參閱相應snippet

+0

'SWT.COLOR_TRANSPARENT'似乎並不適合我。我剛剛更新到火星,我是否需要重新下載SWT庫? – Aerebes 2015-03-25 15:48:54

+0

這一切都取決於你如何消費SWT,作爲一個獨立的罐子?作爲一個捆綁?在RCP應用程序中? 'SWT.getVersion()'包含什麼? – 2015-03-25 16:31:01

+0

'SWT.getVersion()'輸出4430當我把它放在一個打印語句。要下載SWT我去幫助>在Eclipse自己安裝新軟件 – Aerebes 2015-03-25 16:36:19