Time for action – getting colorful

To add an option for ClockWidget to have a different color, an instance must be obtained, instead of the hardcoded BLUE reference. Since Color objects are Resources, they must be disposed correctly when the widget is disposed.

To avoid passing in a Color directly, the constructor will be changed to take an RGB value (which is three int values), and use that to instantiate a Color object to store for later. The lifetime of the Color instance can be tied to the lifetime of ClockWidget.

  1. Add a private final Color instance called color to ClockWidget:
    private final Color color;
  2. Modify the constructor of ClockWidget to take an RGB instance, and use it to instantiate a Color object. Note that the color is leaked at this point, and will be fixed later:
    public ClockWidget(Composite parent, int style, RGB rgb) {
      super(parent, style);
      // FIXME color is leaked!
      this.color = new Color(parent.getDisplay(),rgb);
      ...
  3. Modify the paintControl() method to use this custom color:
    protected void paintControl(PaintEvent e) {
     ...
     e.gc.setBackground(color);
     e.gc.fillArc(e.x, e.y, e.width-1, e.height-1, arc-1, 2);
  4. Finally, change ClockView to instantiate the three clocks with different colors:
    public void createPartControl(Composite parent) {
      ...
      final ClockWidget clock =
        new ClockWidget(parent, SWT.NONE, new RGB(255,0,0));
      final ClockWidget clock2 =
        new ClockWidget(parent, SWT.NONE, new RGB(0,255,0));
      final ClockWidget clock3 =
        new ClockWidget(parent, SWT.NONE, new RGB(0,0,255));
  5. Now run the application and see the new colors in use:
    Time for action – getting colorful

What just happened?

The Color object was created based on the red/green/blue value passed in to the ClockWidget constructor. Since RGB is just a value object, it doesn't need to be disposed afterwards.

Once the Color is created, it is assigned to the instance field. When the clocks are drawn, the second hands are the appropriate colors.

Note

The one problem with this approach is that the Color instance is leaked. When the view is disposed, the associated Color object is garbage collected, but the resources associated with the native handle are not.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset