Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
8.8 Ein Widget mit Swing<br />
gen, so dass auch nach Öffnen der Shell der Canvas für Mausklicks<br />
zugänglich bleibt.<br />
Die Technik, diese Shell mit setVisible() abwechselnd sichtbar<br />
und unsichtbar zu schalten, ist einem wechselweisen Neuanlegen und<br />
Schließen vorzuziehen. Nicht nur werden damit Ressourcen geschont,<br />
auch werden damit unschöne Effekte vermieden. Nach einem close()<br />
würden Teile der close()-Ereignisverarbeitung erst nach Ablauf der<br />
AWT-Ereignisverarbeitung (also auch nach canvasComp.redraw()) ausgeführt,<br />
so dass an der Position des Editors ein hässlicher weißer Fleck<br />
zurückbleiben würde. <strong>Das</strong> ist bei Verwendung der Methode set-<br />
Visible(false) nicht der Fall.<br />
// Mausklicks auf dem Canvas verarbeiten<br />
canvas<br />
.addMouseListener(new java.awt.event.MouseListener() {<br />
public void mouseClicked(<br />
java.awt.event.MouseEvent e) {}<br />
public void mouseEntered(<br />
java.awt.event.MouseEvent e) {}<br />
public void mouseExited(<br />
java.awt.event.MouseEvent e) {}<br />
public void mousePressed(<br />
java.awt.event.MouseEvent e) {<br />
// Popup-Editor verwalten<br />
display.syncExec(new Runnable() {<br />
public void run() {<br />
if (eShell == null) {<br />
// Neue Shell anlegen: nicht-modal!<br />
eShell = new Shell(shell, <strong>SWT</strong>.NO_TRIM<br />
| <strong>SWT</strong>.MODELESS);<br />
eShell.setLayout(new FillLayout());<br />
// Texteingabefeld<br />
eText = new Text(eShell, <strong>SWT</strong>.BORDER);<br />
eText.setText("Textrotation im <strong>SWT</strong>?");<br />
eShell.pack();<br />
// Positionieren (Displaykoordinaten)<br />
java.awt.Rectangle bounds = canvas<br />
.getBounds();<br />
org.eclipse.swt.graphics.Point pos = canvasComp<br />
.toDisplay(bounds.width / 2,<br />
bounds.height / 2);<br />
Point size = eShell.getSize();<br />
eShell.setBounds(pos.x, pos.y, size.x,<br />
207