螢幕右下角彈出小視窗,向上滑動至指定位置停留幾秒後淡出消失,模仿 MSN/QQ 好友上線提醒。
SWT (Standard Widget Toolkit) 是 Eclipse 專用 GUI 庫,直接呼叫作業系統原生元件,效能優於 AWT/Swing。官網
area.height。upPosition = area.height - 100,初始隱藏位置 downPosition = area.height + 100。leftPosition = area.width - 180。moveStep=2 像素,直到 downPosition <= upPosition。sleep(5000) 5 秒,銷毀 Shell 退出執行緒。
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
public class Test {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell();
shell.setText("主視窗");
shell.setSize(250, 150);
Button btn = new Button(shell, SWT.NONE);
btn.setBounds(50, 20, 100, 25);
btn.setText("彈出通知");
btn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
new Popup("您的好友 xxx 上線了。").start();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.*;
public class Popup extends Thread {
Shell shell;
int moveStep = 2, upPosition, downPosition, leftPosition;
public Popup(String message) {
shell = new Shell(SWT.ON_TOP);
Text text = new Text(shell, SWT.MULTI | SWT.WRAP);
text.setBounds(10, 20, 180, 80);
text.setBackground(shell.getBackground());
text.setText(message);
Rectangle area = Display.getDefault().getClientArea();
upPosition = area.height - 100;
downPosition = area.height + 100;
leftPosition = area.width - 180;
shell.setSize(180, 100);
shell.setLocation(leftPosition, downPosition);
shell.open();
}
public void run() {
Display display = shell.getDisplay();
while (true) {
try {
Thread.sleep(10);
if (downPosition - moveStep > upPosition) {
display.asyncExec(() -> {
shell.setLocation(leftPosition, downPosition - moveStep);
downPosition -= moveStep;
});
} else {
Thread.sleep(5000);
display.asyncExec(() -> shell.dispose());
break;
}
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
SWT.ON_TOP 確保彈窗置頂。Display.asyncExec() 確保 UI 操作在 UI 執行緒執行。本文來自編程入門網:原文連結