3.6.2. Die Schnittstelle IComponent

Die Schnittstelle IComponent stellt die gemeinsamen Funktionen für Fenster und Controls bereit. Die Schnittstelle IComponent erweitert IWidget.

Es folgt eine Übersicht der wichtigsten Methoden:

Neuzeichnen
    void redraw();

Markiert die Komponente, dass sie zu nächstmöglichen Zeitpunkt neu gezeichnet werden muss.

    void setRedrawEnabled(boolean enabled);

Deaktiviert, bzw. aktiviert das Neuzeichnen einer Komponente (und deren Kinder, falls vorhanden). Nachdem das Neuzeichnen deaktiviert wurde, werden alle anstehenden Paint Events verworfen, bis wieder setRedrawEnabled(true) aufgerufen wird.

Diese Funktion kann zum Beispiel verwendet werden, um Flackereffekte zu vermeiden, während ein Container umstrukturiert wird, also Kinder hinzukommen oder entfernt werden.

Das Deaktivieren mittels setRedrawEnabled(false) ist ein Hinweis der nicht für alle Platformen sowie SPI Implementierungen verfügbar ist. Beispielsweise hat diese Funktion unter Swing keinen Effekt. Glücklicherweise gibt es unter Swing aber auch keine Probleme mit Flackern, wenn Container umorganisiert werden.

Ein Aufruf von setRedrawEnabled(true) markiert zudem die Komponente, dass sie neu gezeichnet werden muss (siehe Methode redraw()).

Eingabefokus

In einer Fenster basierten Anwendung kann zur selben Zeit genau ein Control den Eingabefokus haben. Dieses Control empfängt dann die Tastatureingaben des Benutzers. Um den Eingabefokus zu erhalten, kann die folgenden Methode verwendet werden:

    boolean requestFocus();

Der Aufruf der Methode garantiert nicht, dass der Eingabefokus tatsächlich zugewiesen wurde.

Mittels folgender Methode kann überprüft werden, ob eine Komponente den Eingabefokus besitzt.

    boolean hasFocus();

Um sich benachrichtigen zu lassen, dass ein Fokuswechsel stattgefunden hat, kann ein IFocusListener verwendet werden:

    void addFocusListener(IFocusListener listener);

    void removeFocusListener(IFocusListener listener);

Dieser hat die Methoden:

    void focusGained();

    void focusLost();
Tastatureingaben

Um Tastatureingaben zur erhalten kann ein IKeyListener verwendet werden:

    void addKeyListener(IKeyListener listener);

    void removeKeyListener(IKeyListener listener);

Dieser hat die folgenden Methoden:

    void keyPressed(final IKeyEvent event);

    void keyReleased(final IKeyEvent event);

Die Klasse org.jowidgets.tools.controller.KeyAdapter implementiert die IKeyListener Schnittstelle mit leeren Methodenrümpfen und kann verwendet werden, falls nicht alle Methoden implementiert werden sollen.

Die Schnittstelle IKeyEvent hat die folgenden Methoden:

    VirtualKey getVirtualKey();

    Character getCharacter();

    Character getResultingCharacter();

    Set<Modifier> getModifier();

Die enum VirtualKey enthält die F-Tasten, Steuertasten wie ENTER, BACKSPACE, TAB, PFEILTASTEN, etc, sowie Zahlen und Buchstaben. Eine vollständige Übersicht über alle VirtualKeys findet sich in der API Spezifikation: http://www.jowidgets.org/api_doc/org/jowidgets/common/types/VirtualKey.html

Die Methode getCharacter() liefert das zugehörige Zeichen der Taste ohne Anwendung der Modifier. Auf einer deutschen Tastatur liefert somit SHIFT + 1 das Zeichen 1 und nicht das Zeichen !.

Dagegen liefert die Methode getResultingCharacter() das zugehörige Zeichen mit Anwendung der Modifier. Im vorigen Beispiel also anstatt 1 das Zeichen !.

Die Methode getModifier() liefert ein Set der verwendeten Modifier Tasten (CTRL, SHIFT, ALT).

Mauseingaben

Um einfache Mauseingaben zur erhalten, kann ein IMouseListener verwendet werden:

    void addMouseListener(IMouseListener listener);

    void removeMouseListener(IMouseListener listener);

Ein IMouseListener hat die folgenden Methoden:

    void mousePressed(IMouseButtonEvent event);

    void mouseReleased(IMouseButtonEvent event);

    void mouseDoubleClicked(IMouseButtonEvent event);

    void mouseEnter(IMouseEvent event);

    void mouseExit(IMouseEvent event);

Ein IMouseEvent liefert die Position des Ereignisses im Koordinatensystem der zugehörigen Komponente:

    Position getPosition();

Ein IMouseButtonEvent liefert zusätzlich den Button sowie die Tastatur Modifier.

    MouseButton getMouseButton();

    Set<Modifier> getModifiers();

Die Klasse org.jowidgets.tools.controller.MouseAdapter implementiert die IMouseListener Schnittstelle mit leeren Methodenrümpfen und kann verwendet werden, falls nicht alle Methoden implementiert werden sollen.

Um Ereignisse zu Mausbewegungen zur erhalten, kann ein IMouseMotionListener verwendet werden:

    void addMouseMotionListener(IMouseMotionListener listener);

    void removeMouseMotionListener(IMouseMotionListener listener);

Dieser hat die folgenden Methoden:

    void mouseMoved(IMouseEvent event);

    void mouseDragged(IMouseButtonEvent event);

Die Methode mouseMoved() wird bei jeder Änderung der Mausposition aufgerufen, die Methode mouseDragged(), wenn dabei eine Maustaste gedrückt wird.

Die Klasse org.jowidgets.tools.controller.MouseMotionAdapter implementiert die IMouseMotionListener Schnittstelle mit leeren Methodenrümpfen und kann verwendet werden, falls nicht alle Methoden implementiert werden sollen.

Popup Events

Popup Events werden ausgelöst, wenn der Benutzer ein Kontextmenü (Popup Menü) öffnen möchte. Die notwendigen Popup Trigger können auf unterschiedlichen Betriebssystemen variieren. Unter Windows geschieht dies zum Beispiel durch einen Rechtsklick mit der Maus. Um Popup Events zu erhalten, kann ein IPopupDetectionListener verwendet werden:

    void addPopupDetectionListener(IPopupDetectionListener listener);

    void removePopupDetectionListener(IPopupDetectionListener listener);

Dieser hat die folgende Methode:

    void popupDetected(Position position);

Die Methode übergibt die Position im Koordinatensystem der Komponente.

Popup Menus

Mit Hilfe der folgenden Methode kann ein Popup Menü erzeugt werden:

    IPopupMenu createPopupMenu();

Ein Popup Menu implementiert die Schnittstelle IMenu, somit kann man zum Beispiel mit Hilfe der Methode addItem() Menüeinträge hinzufügen. Das Menü kann mit Hilfe der Methode show() angezeigt werden:

    void show(Position position);

Dabei ist die Position im Koordinatensystem der Komponente anzugeben, für die das Popup Menü erzeugt wurde.

Folgendes Beispiel zeigt die Verwendung eines PopMenüs:

  1      final IPopupMenu menu = frame.createPopupMenu();
  2      
  3      final ISelectableMenuItem option = menu.addItem(BPF.checkedMenuItem("My option"));
  4      option.addItemListener(new IItemStateListener() {
  5          @Override
  6          public void itemStateChanged() {
  7              System.out.println("My option selected: " + option.isSelected());
  8          }
  9      });
 10      
 11      frame.addPopupDetectionListener(new IPopupDetectionListener() {
 12          @Override
 13          public void popupDetected(final Position position) {
 14              menu.show(position);
 15          }
 16      });

Popup Menüs können auch mit Hilfe von Menu Models erzeugt werden. Die Methode:

    void setPopupMenu(IMenuModel model);

erzeugt ein Popup Menü und bindet es an das übergebene Menu Model. Sobald ein Popup Event ausgelöst wurde, wird das zugehörige Popup Menü angezeigt. Das obige Beispiel sieht dann wie folgt aus:

  1      final MenuModel menu = new MenuModel();
  2  
  3      final ICheckedItemModel option = menu.addCheckedItem("My option");
  4      option.addItemListener(new IItemStateListener() {
  5          @Override
  6          public void itemStateChanged() {
  7              System.out.println("My option selected: " + option.isSelected());
  8          }
  9      });
 10  
 11      frame.setPopupMenu(menu);

Die Verwendung von MenuModels hat mehrere Vorteile. Im obigen Beispiel spart man sich zum einen den folgenden Boilerplate Code:

  1      frame.addPopupDetectionListener(new IPopupDetectionListener() {
  2          @Override
  3          public void popupDetected(final Position position) {
  4              menu.show(position);
  5          }
  6      });

Zum Anderen kann ein MenuModel wiederverwendet werden. Im folgenden wird das selbe PopMenu auch im Hauptmenü einer Menübar hinzugefügt:

  1      menu.setText("Main Menu");
  2      
  3      final MenuBarModel menuBar = new MenuBarModel();
  4      menuBar.addMenu(menu);
  5      
  6      frame.setMenuBar(menuBar);

Weitere Information finden sich auch in den Abschnitten Menüs und Items sowie Menü und Item Models.

Farben

Mit Hilfe der folgenden Methoden kann die Vorder- und Hintergrundfarbe umgesetzt werden:

    void setForegroundColor(final IColorConstant colorValue);

    void setBackgroundColor(final IColorConstant colorValue);

Nicht alle Komponenten unterstützen diese Funktion für alle SPI Implementierungen und auf allen Betriebssystemen. So kann zum Beispiel unter Windows und SWT nicht die Hintergrundfarbe eines Buttons geändert werden. Durch das Setzen von null wird die Default Farbe verwendet.

Um die aktuell gesetzte Farbe zu erhalten, können folgende Methoden verwendet werden:

    IColorConstant getForegroundColor();

    IColorConstant getBackgroundColor();

Wurde zuvor keine spezielle Farbe gesetzt und ist somit die Default Farbe aktiv, wird null zurückgegeben.

Zu allgemeinen Verwendung von Farben siehe auch den Abschnitt über Farben.

Mauszeiger

Mit Hilfe der folgenden Methode kann der Mauszeiger (Cursor) geändert werden:

    void setCursor(final Cursor cursor);
Der visible Status

Der visible Status einer Komponente legt fest, ob eine Komponente potentiell sichtbar ist. Der Status kann mit den folgenden Methoden gesetzt und abgefragt werden:

    void setVisible(final boolean visible);

    boolean isVisible();

Die Verwendung kann für Fenster und Controls unterschiedlich sein. Ein Fenster wird durch setVisible(true) auf dem Bildschirm angezeigt und durch setVisible(false) versteckt.

Bei Controls hängt es vom verwendeten LayoutManager ab, wie damit verfahren wird. Mig Layout bietet zum Beispiel verschiedene hidemodes für den Umgang mit nicht sichtbaren Controls an.

Der Status visible==true sagt nicht aus, dass die Komponente tatsächlich auf dem Bildschirm sichtbar ist. So werden zum Beispiel Controls in nicht sichtbaren TabItems (siehe auch TabFolder) mit Status visible==true nicht angezeigt. Minimierte Fenster haben, auch wenn sie nicht auf dem Bildschirm sichtbar sind, den Status visible==true.

Der showing Status

Um Informationen über die Sichtbarkeit auf dem Bildschirm zu erlangen, kann der showing Status verwendet werden. Dieser wird mittels der folgenden Methode abgefragt:

    boolean isShowing();

Der Status ist wie folgt definiert:

Eine Root Komponente hat den Status showing==true wenn visible==true ist. Eine Kind Komponente hat den Status showing==true wenn sie den Status visible==true und wenn ihr Vater den Status showing==true hat.

Unter der Annahme, das der verwendetet LayoutManager Controls mit dem Status visible==false nicht anzeigt, gilt dann folgendes:

  • showing==false -> Die Komponente ist definitiv nicht am Bildschirm sichtbar

  • showing==true -> Die Komponente ist eventuell am Bildschirm sichtbar. (Sie könnte jedoch durch andere Fenster verdeckt sein oder sich im nicht sichtbaren Bereich eines ScrollComposite befinden und somit dennoch nicht angezeigt werden.)

Der Status showing==false kann etwa ausgenutzt werden, um die Performance zu optimieren, indem für nicht dargestellte Controls Berechnungen ausgelassen werden.

Um sich über Änderungen des showing Status informieren zu lassen, kann ein IShowingStateListener verwendet werden:

    void addShowingStateListener(IShowingStateListener listener);

    void removeShowingStateListener(IShowingStateListener listener);

Dieser hat die folgende Methode:

    void showingStateChanged(boolean isShowing);
Größe und Position

Mit folgenden Methoden kann die Größe eine Komponente gesetzt und ausgelesen werden:

    void setSize(final Dimension size);
    
    void setSize(int width, int height);
    
    Dimension getSize();

Folgende Methoden dienen zum Setzen und Auslesen der Position:

    void setPosition(final Position position);
    
    void setPosition(int x, int y);
    
    Position getPosition();

Bei Controls ist die Position relativ zum Usprung ihrer Vaterkomponente definiert.

Für Fenster handelt es sich bei der Position um Bildschirmkoordinaten. Dies gilt auch für Kindfenster wie zum Beispiel einen Dialog. Dessen Koordinaten sind nicht relativ zum Vaterfenster zu verstehen.

Der Ursprung eines Koordinatensystems zur Positionsangabe ist immer oben links. Y - Werte verlaufen also von oben nach unten.

Um die Position und Größe einer Komponente in Einem zu setzen, können die folgenden Methoden verwendet werden:

    void setBounds(Rectangle bounds);
    
    Rectangle getBounds();

Die Klassen Dimension, Position und Rectangle wurden immutable entworfen. Das bedeutet, dass ihre Koordinaten im Nachhinein nicht modifiziert werden können.

Koordinatenumrechung

Zur Umrechnung von Bildschirmkoordinaten in lokale Koordinaten (bezüglich der Vaterkomponente) oder zurück können die folgenden Methoden verwendet werden:

    Position toLocal(final Position screenPosition);
    
    Position toScreen(final Position localPosition);

Zur Umrechnung von Koordinaten in ein Koordinatensystem einer anderen Komponente oder zurück können die folgenden Methoden verwendet werden:

    Position fromComponent(final IComponentCommon component, final Position componentPosition);

    Position toComponent(final Position componentPosition, final IComponentCommon component);

Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation