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);
}
}
我與區域試驗,因爲這是大多數的我已經能夠找到類似的問題已經建議,但它似乎並不可能將標籤貼在透明段。
'SWT.COLOR_TRANSPARENT'似乎並不適合我。我剛剛更新到火星,我是否需要重新下載SWT庫? – Aerebes 2015-03-25 15:48:54
這一切都取決於你如何消費SWT,作爲一個獨立的罐子?作爲一個捆綁?在RCP應用程序中? 'SWT.getVersion()'包含什麼? – 2015-03-25 16:31:01
'SWT.getVersion()'輸出4430當我把它放在一個打印語句。要下載SWT我去幫助>在Eclipse自己安裝新軟件 – Aerebes 2015-03-25 16:36:19