GlassPane reagiert nicht auf listener

mrno

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

Code:
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");
	}
}
 
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?
 
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
 
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.
 
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
 
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
 
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.
 
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
 
Hi,
hier hast du mal ein beispiel das ich zum testen verwendet habe. Geht aber leider nur wenn es über das Applet läuft.

Code:
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).
 
Zuletzt bearbeitet:
Zurück