JPopupMenu in einer JScrollPane

Xexanos

Grünschnabel
Hallo Leute,

Ich hab ein problem mit einem Webapplet das ich schreibe, und zwar:
Ich hab eine Klasse (galleryTree) die ich von JScrollPane ableite und in der ich einen JTree darstelle. Mein Problem ist nun, das ich der ganzen Komponente ein Popummenü geben möchte (also ein JPopupMenu) dieses hab ich auch instanziert und alles, aber aus irgendeinem Grund reagiert mein Mouselistener nicht...
Hier der code:
Code:
	public void start()
	{
		String userid = new String(userID);
		
		this.getParameters();
		
		if (userID.equals(userid))
		{
			tree = new galleryTree(traceID, userID); //<-- von JScrollPane apgeleitet
		}
		
		final JLabel lbl1 = new JLabel("Hier kommt später der Ordnerinhalt rein!", JLabel.CENTER);
		lbl1.setSize(width - 250, height - 22);
		lbl1.setLocation(250, 0);
		lbl1.setBackground(bgcolor);
		lbl1.setForeground(fontcolor);
		lbl1.setOpaque(true);
		lbl1.setVisible(true);
		
		textF = new JTextField("Hier kommt später der Kommentar rein!");
		textF.setSize(width - 250, 22);
		textF.setLocation(250, height - 22);
		textF.setOpaque(true);
		
		//Das Popupmenü:
		popup = new JPopupMenu();
		JMenuItem addGallery = new JMenuItem("Gallerie hinzufügen");
		JMenuItem delGallery = new JMenuItem("Gallerie löschen");
		JMenuItem renameGallery = new JMenuItem("Gallerie umbenennen");
		popup.add(addGallery);
		popup.add(delGallery);
		popup.add(renameGallery);
		
		tree.setSize(250, height);
		tree.setAlignmentX(JTree.LEFT_ALIGNMENT);
		tree.setVisible(true);
		tree.getTree().getSelectionModel().addTreeSelectionListener(new TreeSelectionListener()
		{
			public void valueChanged(TreeSelectionEvent e)
			{
				TreePath path = e.getNewLeadSelectionPath();
				lbl1.setText(path.toString());
			}
		});
		//Der MouseListener:
		tree.addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{
				if(e.getButton() == MouseEvent.BUTTON2)
				{
					popup.show(tree, e.getX(), e.getY());
					popup.setVisible(true);
				}
			}
		});
		
		ContentPane.add(textF);
		ContentPane.add(lbl1);
		ContentPane.add(tree);
		
		ContentPane.setLayout(null);
		ContentPane.setVisible(true);
	}
 
Hallo,

was ich so sagen kann :

Code:
popup.setVisible(true);

ist völlig unnötig ! - - Hast du mal mit einem klassischen

Code:
System.out.println("PopUpClick");

im IF-Block geprüft ob dieser überhaupt aufgerufen wird ?

Im übrigen sollte man sowohl im mousePressed als auch im mouseReleased
das Event auf isPopupTrigger testen und wenn true das Popup poppen lassen !

Noch ne Frage, warum setzt du das Layout nach dem hinzufügen der Komponenten
noch auf null ?

Gruß JAdix
 
also, ich hab das mit dem System.out mal gemacht, und der geht garnicht in die Methode rein...
Woran könnte das liegen, hab ich den falsch registriert?

MFG
Xexanos
 
geht er nur nicht in die if-Abfrage rein, oder wird tatsächlich die Methode überhaupt nicht aufgerufen?
 
Ich kann das jetzt grade nicht testen, aber ich glaube, der Tree hat einen relativ engen Bereich, in dem er auf Events reagiert.

Ich glaube du musst die Knoten wirklich direkt selbst anklicken - und nicht im weißen Bereich - kann das aber wie gesagt leider nicht testen.

Ansonsten schaut die Registrierung des Listeners in Ordnung aus.
 
Ich glaube du musst die Knoten wirklich direkt selbst anklicken - und nicht im weißen Bereich - kann das aber wie gesagt leider nicht testen.
Wie gesagt, das Object tree ist eine von JScrollPanel abgeletete Klasse... (ich weiß meine Variablenbenennung ist nicht so prickend) aber bei klick auf die Komponenten passiert auch nichts!
 
Hmm...

*Fragen in den Raum werf, weil nicht sicher und wie gesagt ohne Testmöglichkeit*
Kann eine Scrollpane überhaupt MouseEvents empfangen?
Welche "anfassbaren" Bereiche (für einen Listener) hat eine Scrollpane -> doch eigentlich nur die Ränder?
Da das innere ja für andere Listener bereit stehen muss, kann ein Listener direkt auf der Scrollpane nicht funktionieren?
 
Hallo,

sicher kann eine ScrollPane MouseEvents empfangen, war aber sicher nur
ne retorische Frage !

Ich würde den Listener auch direkt beim JTree registrieren.

Der JTree nimmt das Event als erstes engegen, nur in einem Bereich des JScrollPanes
in dem keine andere Komponente angezeigt wird (was ja selten der fall ist) würde das
Event bis zum ScrollPane durchschlagen !

Aber ich werd nochmal ein klein wenig Coden um das nachzuprüfen !

Gruß JAdix
 
. . . back from coding ...

Wie zuvor von mir beschrieben erreichen MouseEvents nur das ScrollPane wenn keine
andere "aktive" Komponente diese weg fängt !

Ein Beispiel :

Liegt ein JPanel als ViewPort im ScrollPane, sagen wir mit einem Button darauf,
so erreichen über dem Button erzeugte MouseEvents das ScrollPane nicht.
Im Bereich des leeren Panels hingegen werden die Events zum ScrollPane durchgereicht !

Da nun ein JTree den gesamten ViewPort zu seinem aktiven Bereich macht ist
schluss mit Events für das ScrollPane.
Lediglich die kleine quadratische Fläche zwischen den Slidern (die Slider selbst nicht)
und einen ein Pixel breiten Bereich um das ScrollPane waren bei meinem Test für MouseEvents empfänglich !

Die moral von der Geschicht . . .
... MouseListen deine ScrollPane nicht ! :)

Gruß JAdix
 
Zurück