SWT Popupmenu auf der Überschrift eines swt.widgets.Table verhindern?

Enternix

Mitglied
Ich versuche gerade etwas SWT/JFace mit den Snippets auf eclipse.org zu lernen. Dabei bin ich auf das JFace-Snippet-018 gestoßen: JFaceSnippets - Eclipsepedia

Hier wird demonstriert, wie man in einem org.eclipse.jface.viewers.TableViewer Zellen editieren kann und wie man mit einem Popup-Menü eine Spalte hinzufügen und auch wieder entfernen kann.

Das Snippet läuft nicht ganz fehlerfrei, da eine Exception ausgelöst wird, wenn man nach dem Programmstart des Snippets mit der rechten Maustaste auf die Tabellenüberschrift klickt und "Insert e-mail before" auswählt.

Das liegt daran, dass in der Methode triggerColumnSelectedColumn die Stelle des Mausklicks lokalisiert werden soll, um an dieser Stelle die Spalte hinzuzufügen. Klickt man jedoch mit rechts auf die Tabellenüberschrift, wird zwar das Popup-Menü aufgerufen, der MouseListener innerhalb der Methode triggerColumnSelectedColumn empfängt aber kein mouseDown, so dass die Stelle des Mausklicks nicht lokalisiert werden kann.

Daher würde ich gerne verhindern, dass das Popup-Menü der Tabelle aufgerufen wird, wenn nur auf die Tabellenüberschrift geklickt wird.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Bei mir funktioniert das Beispiel einwandfrei...

EDIT: Ahhh sorry gleich nach dem Start gibts Probleme, sonst passt es immer...
 

Enternix

Mitglied
Ich habe mal die Editierfunktion des Snippets gelöscht, da sie nichts mit dem Problem zu tun hat:
Java:
package org.eclipse.jface.snippets.viewers;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;

public class Snippet018TableViewerSimplified {

	public class Person {
		public String givenname;

		public String surname;

		public String email;

		public Person(String givenname, String surname, String email) {
			this.givenname = givenname;
			this.surname = surname;
			this.email = email;
		}

		public String getValue(String name) {
			Field field;
			try {
				field = getClass().getDeclaredField(name);
				return (String) field.get(this);
			} catch (Exception e) {
				e.printStackTrace();
			}

			return "ERROR";
		}

	}

	public class MyLabelProvider extends LabelProvider implements
			ITableLabelProvider {
		private TableViewer viewer;

		public MyLabelProvider(TableViewer viewer) {
			this.viewer = viewer;
		}

		public Image getColumnImage(Object element, int columnIndex) {
			return null;
		}

		public String getColumnText(Object element, int columnIndex) {
			return ((Person) element)
					.getValue(viewer.getColumnProperties()[columnIndex]
							.toString());
		}
	}

	private int activeColumn = -1;

	public Snippet018TableViewerSimplified(Shell shell) {
		final TableViewer v = new TableViewer(shell, SWT.BORDER);
		v.setLabelProvider(new MyLabelProvider(v));
		v.setContentProvider(ArrayContentProvider.getInstance());

		v.setColumnProperties(new String[] { "givenname", "surname" });

		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
		column.setWidth(200);
		column.setText("Givenname");

		column = new TableColumn(v.getTable(), SWT.NONE);
		column.setWidth(200);
		column.setText("Surname");

		Person[] model = createModel();

		v.setInput(model);
		v.getTable().setLinesVisible(true);
		v.getTable().setHeaderVisible(true);

		addMenu(v);
		triggerColumnSelectedColumn(v);
	}

	private void triggerColumnSelectedColumn(final TableViewer v) {
		v.getTable().addMouseListener(new MouseAdapter() {

			public void mouseDown(MouseEvent e) {
				System.out.println("mouseDown");
				int x = 0;
				for (int i = 0; i < v.getTable().getColumnCount(); i++) {
					x += v.getTable().getColumn(i).getWidth();
					if (e.x <= x) {
						activeColumn = i;
						break;
					}
				}
			}

		});
	}

	private void addMenu(final TableViewer v) {
		final MenuManager mgr = new MenuManager();

		final Action insertEmailBefore = new Action("Insert E-Mail before") {
			public void run() {
				addEmailColumn(v, activeColumn);
			}
		};

		final Action insertEmailAfter = new Action("Insert E-Mail after") {
			public void run() {
				addEmailColumn(v, activeColumn + 1);
			}
		};

		final Action removeEmail = new Action("Remove E-Mail") {
			public void run() {
				removeEmailColumn(v);
			}
		};

		mgr.setRemoveAllWhenShown(true);
		mgr.addMenuListener(new IMenuListener() {

			public void menuAboutToShow(IMenuManager manager) {
				if (v.getTable().getColumnCount() == 2) {
					manager.add(insertEmailBefore);
					manager.add(insertEmailAfter);
				} else {
					manager.add(removeEmail);
				}
			}

		});

		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
	}

	private void removeEmailColumn(TableViewer v) {
		int emailIndex = -1;
		for (int i = 0; i < v.getColumnProperties().length; i++) {
			if (v.getColumnProperties()[i].toString().equals("email")) {
				emailIndex = i;
				break;
			}
		}

		ArrayList<Object> list = new ArrayList<Object>(Arrays.asList(v.getColumnProperties()));
		list.remove(emailIndex);
		String[] columnProperties = new String[list.size()];
		list.toArray(columnProperties);
		v.setColumnProperties(columnProperties);

		v.getTable().getColumn(emailIndex).dispose();

		v.refresh();
	}

	private void addEmailColumn(TableViewer v, int columnIndex) {

		ArrayList<Object> list = new ArrayList<Object>(Arrays.asList(v.getColumnProperties()));
		list.add(columnIndex, "email");
		String[] columnProperties = new String[list.size()];
		list.toArray(columnProperties);
		v.setColumnProperties(columnProperties);

		// 1. Add new column
		TableColumn column = new TableColumn(v.getTable(), SWT.NONE,
				columnIndex);
		column.setText("E-Mail");

		// 2. Update the viewer
		v.refresh();

		// 3. Make the column visible
		column.setWidth(200);
	}

	private Person[] createModel() {
		Person[] persons = new Person[3];
		persons[0] = new Person("Tom", "Schindl", "tom.schindl@bestsolution.at");
		persons[1] = new Person("Boris", "Bokowski",
				"boris_bokowski@ca.ibm.com");
		persons[2] = new Person("Tod", "Creasey", "tod_creasey@ca.ibm.com");

		return persons;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Display display = new Display();

		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());
		new Snippet018TableViewerSimplified(shell);
		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}

		display.dispose();

	}

}
Somit zeigt das Beispiel-Programm nun eine Tabelle an, in die man mit Hilfe eines Rechtsklicks eine Spalte für die E-mail-Adresse ein- und ausblenden kann. Dabei wird die E-mail-Spalte an der Stelle eingefügt, wo geklickt wurde.

In Zeile 99 wird dem TableViewer ein MouseAdapter zum Empfangen von Mouse-Events übergeben. Leider bleibt ein Klick auf die Tabellenüberschrift vom MouseAdapter unbemerkt.

In Zeile 151 wird dem TableViewer ein Kontextmenü übergeben. Und dieses erscheint leider auch wenn man auf die Tabellenüberschrift klickt.

Also gehört für den MouseAdapter die Überschrift nicht mit zur Tabelle, während für das Kontextmenü die Überschrift sehr wohl zur Tabelle gehört. Das Ergebnis ist, dass bei einem Recktsklick auf die Überschrift die Variable activeColumn (Zeile 71) nicht aktualisiert wird und die Spalte daher an der falschen Stelle eingefügt wird.

Hat jemand einen Vorschlag, wie man das Problem lösen könnte?
 

Enternix

Mitglied
Ich sehe gerade, dass es das gleiche Snippet mit neuer API gibt: http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.java?revision=1.5&view=co

Dort wird
Code:
new TableViewerColumn(TableViewer parent, int style, int index)
statt
Code:
new TableColumn(Table parent, int style, int index)
genutzt und
Code:
index
kann dabei nie 'out of range' sein. Trotzdem bleibt aber eigentlich das Problem bestehen, dass die Spalte nicht an der Stelle eingefügt wird, an der man es erwartet, wenn man auf die Tabellenüberschrift klickt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Image im PopupMenu vom SystemTray AWT, Swing, JavaFX & SWT 8
N Swing JCombobox - PopupMenu-Inhalt mit KSKB AWT, Swing, JavaFX & SWT 2
X Swing Bei Buttonklick soll PopupMenu erscheinen AWT, Swing, JavaFX & SWT 2
G PopupMenu für ein JmenuItem AWT, Swing, JavaFX & SWT 3
D Swing PopupMenu immer an gewünschte Position? AWT, Swing, JavaFX & SWT 2
L Swing Popupmenu title AWT, Swing, JavaFX & SWT 5
E Swing Fehlerhaftes Verhalten bei gleichzeitigen Verwendnen von PopUpMenu und JDialog?! AWT, Swing, JavaFX & SWT 5
L JLIST/rechtsklick/PopUpMenu AWT, Swing, JavaFX & SWT 7
F MouseEvent bei PopupMenu abfangen AWT, Swing, JavaFX & SWT 2
G JCombobox PopupMenu feste größe zuweisen AWT, Swing, JavaFX & SWT 3
G JPanel und ein PopupMenu AWT, Swing, JavaFX & SWT 6
F einem defaultmutabletreenode ein popupmenu zuordnen! AWT, Swing, JavaFX & SWT 3
F Problem mit PopupMenu und eigenem Panel AWT, Swing, JavaFX & SWT 5
I popupmenu über awt AWT, Swing, JavaFX & SWT 3
G JTable - PopUpMenu nur bei Selektion anzeigen. AWT, Swing, JavaFX & SWT 8
A PopupMenu mit Shorcuts AWT, Swing, JavaFX & SWT 5
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
T Nimbus Überschrift AWT, Swing, JavaFX & SWT 10
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
C JTappedPane Mouselistener auf Überschrift Registerkarte AWT, Swing, JavaFX & SWT 2
N Swing JTable Überschrift ohen scrollbar? AWT, Swing, JavaFX & SWT 2
aze JDialog immer so breit ,dass die Überschrift sichtbar ist AWT, Swing, JavaFX & SWT 6
J Frage zu JTable und der Überschrift/Titelzeile AWT, Swing, JavaFX & SWT 2
P Umrahmte Überschrift AWT, Swing, JavaFX & SWT 2
G Überschrift einfügen! AWT, Swing, JavaFX & SWT 6
R JTable Überschrift nicht zu sehen AWT, Swing, JavaFX & SWT 3
G Zweizeilige Spalten-Überschrift bei JTable AWT, Swing, JavaFX & SWT 2
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
V JavaFX Teile eines Images Transparent machen AWT, Swing, JavaFX & SWT 4
I JavaFX Langes drücken eines Buttons AWT, Swing, JavaFX & SWT 4
B Swing Wie Witdh und Height eines GuiElements bekommen AWT, Swing, JavaFX & SWT 5
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
T Nur bestimmte Bereiche eines Fotos bearbeiten AWT, Swing, JavaFX & SWT 0
J Swing Erstellung eines User Interface AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
javampir Swing Wanderung eines JFrames AWT, Swing, JavaFX & SWT 7
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
I Erstellung eines kleinen Programmes AWT, Swing, JavaFX & SWT 8
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben