# GlassPane reagiert nicht auf listener



## mrno (29. März 2006)

Hi,
ich habe eine klasse mit einem JRootPane auf dieses soll ein GlassPane gezeichnet werden was mache ich falsch?


```
package applet.menue;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.MenuItem;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Vector;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRootPane;

import applet.menue.MenueMove;

public class Menue extends JRootPane implements MouseListener{
	MenueDesign mDesign;
	Component []array;
	Component upItem,downItem;
	MenueRoot menueRoot;
	JPanel glassPanel = new JPanel();
	Vector v=new Vector();
	int count=0;
	public Menue(MenueDesign mDesign){
		getGlassPane().setBounds(0,0,100,310);
		getGlassPane().setVisible(true);
		getGlassPane().addMouseListener(this);
		this.mDesign=mDesign;
		upItem=mDesign.upItem();
		upItem.addMouseListener(this);
		downItem=mDesign.downItem();
		downItem.addMouseListener(this);
	}
	public void setBounds(Rectangle rectangle){
		try{
		super.setBounds(rectangle);
		int anzahl=((rectangle.height-50)/15);
		anzahl=(anzahl*15>rectangle.height-50)?anzahl--:anzahl;
		System.out.println("anzahl:"+anzahl);
		array = new Component[anzahl];
		draw();
		}catch(Exception e){}
	}
	protected void aktuallisiere(MenueItemStandart menueItemStandart){
		if(menueItemStandart.getVisible()==true){
			for(int i=0;i<menueItemStandart.countChild();i++)
			{
				v.addElement(menueItemStandart.getChild(i));
				aktuallisiere(menueItemStandart.getChild(i));
			}
		}
	}
	public void draw(){
		try{
		removeAll();
		setLayout(null);
		v.removeAllElements();
		try{
		aktuallisiere(menueRoot);
		}catch(Exception e){
		}
		for(int i=0;i<array.length&&i+count<v.size();i++){
			MenueItem menueItem=(MenueItem)v.elementAt(i+count);
			if(menueItem.countChild()==0){
				array[i]=mDesign.newEndItem();
				mDesign.setTextEndItem(array[i],menueItem.getName());
			}else{
				array[i]=mDesign.newItem();
				mDesign.setTextItem(array[i],menueItem.getName());
			}
			array[i].addMouseListener(this);
			array[i].setBounds(new Rectangle(5*menueItem.getPosition(),25+15*i,getWidth()-(5+5*menueItem.getPosition()),15));
			add(array[i]);
		}
		repaint();
		}catch(Exception e){}
	}
	public void addMenueRoot(MenueRoot menueRoot){
		menueRoot.addMenue(this);
		menueRoot.setVisible(true);
		this.menueRoot=menueRoot;
		draw();
	}
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
	}

	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("true");
	}

	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("false");
	}
}
```


----------



## flashray (29. März 2006)

Hallo,

schau dir mal dieses Beispiel an:
http://www.java2s.com/ExampleCode/Swing-JFC/DemonstrateuseofGlassPane.htm

Dort wird auf ein Glasspane ein Button gelegt, welches auch Listener empfängt. Probier mal ob du das auf deine Wünsche anpassen kannst.


Vg Erdal


----------



## mrno (30. März 2006)

Ich habe schon mehrere solche beispiele gesehen. Leider bekomme ich in solchen Programmen das GlassPane immer aus einem Frame. Ich will aber jetzt ein GlassPane auf ein JRootPane legen dass in einem Applet läuft. Ich kann es nicht direkt aus der Klasse Applet ableiten. Leider habe ich die funktion des GlassPane nur hinbekommen wenn ich applet.getGlassPane gemacht habe. Was mache ich falsch. Geht es aus einem RootPane direkt vielleicht gar nicht? Brauche ich immer ein Frame oder Applet dazu?


----------



## flashray (30. März 2006)

Erzähl doch nochmal bitte genau, was du vorhast? Für was brauchst du einen Rootpane? Du möchtest also ein Applet erstellen. Welche Funktion soll die GlassPane erledigen?

Vg Erdal


----------



## mrno (30. März 2006)

Wie du vielleicht schon gesehen hast ist die Klasse für ein Menü gedacht. Ich habe mir jetzt überlegt das ich eine funktion schreibe die das Menü ausfahren lässt wenn die Maus drauf zeigt. Wenn die Maus das Menü wieder verlässt soll das Menü wieder an der Seite verschwinden. Da dieses Menü aus mehreren Komponenten besteht brauche ich einen Listener der für die ganze Componente Menü-Componenten funktioniert. Da habe ich mir gedacht ich löse dies über ein JRootPane mit GlassPane. Das mit dem Applet war nur nebenher so gesagt. Ich habe es mal am Applet selber versucht mit dem GlassPane da ging es. Aber wenn ich ein JRootPane hinzufüge und dort ein GlassPane verwenden will geht das irgendwie nicht.


----------



## elmato (30. März 2006)

Also IMHO liegt das problem daran das du ein Panel benutzt, eine Glasspane, erbt/ist normalerweise ein JComponent, die Variable glassPanel, in deinem Code ist glaube ich eher mit der ContentPane vergleichbar, hab gerade keine Zeit, aber wenn ich heute Mittag wieder da bin und es noch nicht gelöst ist schau ich mal ob ich ein Beispiel auf die Reihe kriege..

mfg
elmato


----------



## flashray (30. März 2006)

Hallo mrno,

also dein Vorhaben hat mich für das Verwenden einer Glasspane nicht überzeugt. Wie wärs mit einer JMenuBar. Du hast ganzen oben im Frame eine Menüleiste. Die Menüelemente sind hier auch bis auf den Menünamen nicht sichtbar. Oder du meinst das ist nicht flexible genug. Dann gibts das JToolBar. Das kannst du je nach Wunsch nördlich, südlich, östlich, westlich ausrichten. Und auch dynamisch die Ausrichtung ändern. Wenn dir das immer noch zu unflexible ist, und dich die Leiste stört gibt es ein JPopupMenu, die du je nach Wunsch an fester oder unterschiedlichen stellen mit show() aufrufen kannst.

Wieso versuchst du dass so umständlich mit einer Glasspane zu bewerkstelligen? Ich kann deine Idee nicht ganz nachvolziehen. Hast du ein Beispiel, ein Screenshot aus einem vergleichbaren Programm, das dieses schon implementiert hat.

Vg Erdal


----------



## mrno (30. März 2006)

Hi flashray,
ich habe selber eine Menü klasse geschrieben mit animationen usw. Jetzt will ich nur wie z.B. bei windows oder linux gibt es die funktion, das die Menüleiste automatisch verschwindet wenn man Sie nicht braucht. Meistens wird Sie nach unten weggefahren. So eine funktion möchte ich in meiner Klasse auch einbauen. Mein Problem war bis jetzt wenn ich einen Mouselistener auf die Componente Menue hinzugefügt habe meinte das Programm das wenn ich auf ein Element klicke (MenüComponente) ich die Oberfläche des Menü's verlasse (Dies kommt ja daher da ich auf eine andere komponente komme). Dadurch kann ich keine elemente auswählen. Nun war die überlegung da ein Glasspane drüber zu legen um dieses Problem zu umgehen. Ich hoffe dieses mal war es verständlich.


----------



## flashray (30. März 2006)

Hallo mrno,

könntest du mal bitte einen soweit funktionierenden Quellcode ohne dieses Glasspane anhängen, mitteilen. Mit funktionierend meine ich jetzt das ich die Klasse soweit ausführen und das Problem dann hier auf meinem PC sehen könnte.

Bei deinem letzten Code fehlt einfach zu viel, der ist nicht ausführbar.

Vg Erdal


----------



## mrno (30. März 2006)

Hi,
hier hast du mal ein beispiel das ich zum testen verwendet habe. Geht aber leider nur wenn es über das Applet läuft.


```
public class Menue extends JApplet implements MouseListener{

public void init(){
setLayout(null);
setSize(100,100);
/*getGlassPane().setBounds(new Rectangle(0,0,100,100);
getGlassPane().addMouseListener(this);
getGlassPane().setVisible(true);*/
JRootPane jrp = new JRootPane();
jrp.setBounds(new Rectangle(0,0,50,50));
jrp.getGlassPane().setBounds(new Rectangle(0,0,50,50);
jrp.getGlassPane().addMouseListener(this);
jrp.getGlassPane().setVisible(true);
add(jrp);
}

                public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
	}

	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("true");
	}

	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("false");
	}

}
```

So hier ist mal mein experiment applet. So funktioniert es leider nicht. Es wird kein aktionlistener ausgeführt wenn ich auf die stelle klicke an der sich das GlassPane befinden sollte. Das JRootPane wird aber dagestellt. Klammere ich das JRootPane aus und teste es bei dem Applet (das was jetzt in kommentar steht funktioniert).


----------



## flashray (30. März 2006)

Hallo mrno,

ich muss dich leider enttäuschen. Die Methode getGlassPane liefert ein Objekt der Klasse Component. Diese unterstüzt keinen ActionListener. Da musst du einen der unterstützen Listener verwenden.

Zweitens, hast du gemeint ob man immer ein JFrame oder ein JApplet für ein GlassPane braucht. Es gibt keine eigenständige Komponente GlassPane. Ein JRootPane besteht aus einem LayeredPane und einer GlassPane. D.h. du brauchst auf jeden Fall ein RootPane. Schau dir bitte den folgenden Link an:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JRootPane.html

Da wirst du ein Bild sehen, in der alle Komponenten aufgeführt sind, welche ein JRootpane enthalten. Das sind dann JFrame, JWindow, JDialog und andere.

Fazit: Enweder du verwendest ein JRootPane oder eines der Komponenten welche ein Rootpane schon intern haben, um zugriff auf eine GlassPane zu haben. Du müsstest einen anderen Listener verwenden, denn der ActionListener wird hier nicht unterstüzt.


Darf man auch eine Kostprobe deines SuperDuperMenüs sehen. Oder ist der QuellCode streng geheim  .

Vg Erdal


----------



## mrno (30. März 2006)

@flashray




> Darf man auch eine Kostprobe deines SuperDuperMenüs sehen. Oder ist der QuellCode streng geheim  .



Das Problem ist das das Menü fest in einem browsergame(hab fertig) integriert ist (Es ist ein bisschen durcheinander). Wenn ich mal zeit habe, sortiere ich die klassen und mach ein standalone menü draus.

Hab meinen fehler gefunden danke für eure hilfe.


----------

