All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.pivot.wtk.Renderer Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.pivot.wtk;

import org.apache.pivot.collections.Dictionary;

/**
 * Base interface for "renderers". Renderers are used to customize the
 * appearance of a component's content.
 *
 * 

There are several components in Pivot that accept an arbitrary Java * object or objects to show as part of their appearance, such as the label * of a {@link LinkButton}, the items in a the drop-down menu of a {@link * ListButton}, or the cells in a {@link TableView}. By default these * components know how to display strings, but you can define a custom * renderer to change the default behaviour and/or use non-string data. * *

The exact details of the renderer subinterfaces differ according to the * needs of the component, but they all use the the following framework: * *

    *
  • A render method, which is called when the component * needs to discover the appearance of a data item, and
  • *
  • A toString method, which is called when the user wants * to navigate via keyboard. (This, of course, may not make sense for data * that do not contain an apparent textual component.)
  • *
* *

The render method is called during layout and paint * operations. It is passed the data object to be rendered, the component * performing the rendering, and possibly additional parameters giving * context specific to the component, such as whether the object is * "selected", or the relative location of a cell inside the component. The * renderer's job is to change its internal state using the data object and * be prepared to respond to subsequent calls querying the size of the * rendering or to paint it. Some components may also call the * render method with an object of null when * doing layout, if it makes the assumption that all the data elements will * be the same size in one or both dimensions, such as the elements of a * list. * *

Although not strictly required, the most convenient way to define a * renderer is by subclassing a Component, since Components * are already able to respond to layout and paint methods. That means all * the render method has to do is to modify the Component to * include the visually interesting part(s) of the data object in an * appropriate place, such as by setting the text of a Label to an * identifying string from the object, or setting the image of an ImageView * to an icon contained in the object. * *

N.B. If you base a renderer on a Component, you need to call validate on * it in order for it to paint correctly, because your renderer doesn't * have a parent to take care of that for you. Since all components that * call renderers call setSize before calling * paint, the canonical way to handle this is by including the * following override in your renderer: *

     @Override
 *     public void setSize(int width, int height) {
 *         super.setSize(width, height);
 *         validate();
 *     }
*

Note that you don't always need the additional parameters to * render if your renderer is simple enough. For example, * {@link ListView} passes parameters that tell whether the item is * selected or highlighted, but it also sets the background of the area * occupied by the renderer according to those parameters. Thus, if your * render has a transparent background, the selection state will be * apparent. Of course, you may want to adjust font or border colors within * the renderer to be harmonious with that different background. */ public interface Renderer extends ConstrainedVisual { /** * Returns the renderer's style dictionary. */ public Dictionary getStyles(); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy