官术网_书友最值得收藏!

Time for action – responding to the user

When the user clicks on the icon, nothing happens. That's because there is no registered listener on the TrayItem itself. There are two listeners that can be registered; a SelectionListener, called when the icon is clicked, and a MenuDetectListener, which can respond to a context-sensitive menu. The former will be used to present a clock in its own window, which in SWT terms is called a Shell.

  1. Open the Activator class.
  2. Go to the lambda inside the asyncExec in the Activator class's start method.
  3. After the creation of the TrayItem, call addSelectionListener with a new anonymous inner subclass of SelectionListener. In the widgetSelected method, a new Shell should be created with a ClockView and then shown:
    trayItem.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        new ClockWidget(shell, SWT.NONE, new RGB(255, 0, 255));
        shell.pack();
        shell.open();
      }
    });
  4. Run the target Eclipse instance, open the Clock View, and click on the tray icon. A windowed clock will be shown:
  5. Run the target Eclipse instance, click on the TrayItem, and use the Host OSGi Console to stop and start the bundle.

What just happened?

When the TrayItem is installed into the system's Tray, event listeners can be registered to respond to user input. The listener that gets called when the icon is clicked on is the SelectionListener, and this gives the opportunity to display the window (or Shell in SWT terminology).

The Display associated with the TrayItem is used when instantiating the Shell. Although either Display.getDefault() or Display.getCurrent() could be used, neither of these would be the right option. When developers are running in multi-monitor mode, or with a virtual display (which spans multiple desktops), it's important to ensure that the Shell is shown on the same display as the corresponding Tray.

Without a LayoutManager, the clock won't show up. A FillLayout is used here to ensure that the clock is made as large as the window (and resizes accordingly to the window itself). Once the window is created, the pack method is called, which sets the size of the window to the preferred size of its children; in this case, it's the ClockView.

Finally, the window is shown with the open call. When the window is closed, it is automatically disposed.

主站蜘蛛池模板: 乃东县| 南木林县| 常宁市| 邯郸市| 嘉峪关市| 抚州市| 湟中县| 商水县| 灌云县| 察哈| 武宣县| 武川县| 白银市| 肇庆市| 土默特左旗| 武强县| 堆龙德庆县| 鄂伦春自治旗| 子洲县| 基隆市| 思茅市| 宣恩县| 博客| 东山县| 普格县| 玛曲县| 平利县| 龙胜| 周宁县| 临高县| 稻城县| 斗六市| 新巴尔虎左旗| 马鞍山市| 信宜市| 恩施市| 凤庆县| 寿光市| 肇州县| 景东| 太康县|