JMenuBar überlappt von JPanel :(

Status
Nicht offen für weitere Antworten.

Xeyth

Mitglied
Halli hallo ihr Javaraner,

ich habe folgendes Problemchen:

ich habe ein JFrame in dem eine JMenuBar geaddet ist, mit Menüeinträgen und allem drum und drann.

Weiter besitzt dieses JFrame ein JDesktopPane, darin enthalten ein JInternalFrame, welches wiederrum ein JPanel enthält.

Dieses böse JPanel wird zur grafischen Animationsdarstellung benutzt, zeigt also bestimmte Animationen an und wird per doppel-buffering realisiert.

Öffne ich jetzt mein JMenuBar und das Drop-Down geht und wird soweit sauber dargestellt, jedoch nur der Bereich der nicht das JPanel berührt. Dort wird einfach das JMenuBar "überpinselt", so dass also das JMenuBar unter dem JPanel dargestellt wird.

gibt es irgendeine Möglichkeit das JMenuBar absolut in den Vordergrund zu setzen - quasi allwaysontop?

fehler.PNG


weiter hatte ich schon versucht in der zeichenmethode des JPanel die JMenuBar zu repainten, doch hat nichts geholfen.
 
Ich vermute du mischst AWT und Swing.
Warum hast du ein eigenes Double Buffering realisiert. Swing hat seine eigene Buffer Strategy. Wenn du da noch irgendwas drüber legst, wird es lediglich langsam.
 
ne ich hab geschaut das die panel und frames usw alles swing is

ich nehm ein eigenes doppelpuffering, weil mir das von swing nicht effektiv genug arbeitet
 
Äh ja, was hast du denn für spezielle Anforderungen, das dir das Swing-Doublebuffering "nicht effektiv genug arbeitet " :shock: :roll:?

mpG
Tobias

Edit: Hast du das JMenuBar per add() auf die ContentPane gelegt oder (korrekter Weise) die Methode setMenuBar() genutzt?
 
hrm ich hab die JMenuBar mit add zugegeben...

ich glaub ich hab ne Vermutung was du meinst, JMenuBar kommt in ein Panel rein beim adden... und beim set sicherlich in einen speziellen Container...

... ne setMenuBar sagt er nimmt nur awt MenuBars an aber kein JMenuBars 🙁

... ahh es gibt ja noch ein setJMenuBar... ok Versuch schlug auch fehl, keine Veränderung
 
JFrame benutzt halt eine LayeredPane, damit die Menüs und PopupMenüs und Drag&Drop-Sachen etc alle schon in der richtigen "vertikalen" Reihenfolge liegen. Mit add() hebelst du das ganze schöne Konzept halt aus.

Wenn das aber keine Veränderung bringt, liegt der Fehler woanders. Wo können wir dir vielleicht sagen, wenn du uns Code gibst. Ich vermute aber, es liegt an deinem "Will-selber-Doublebuffern"-Schmonsens ...

mpG
Tobias
 
...ja daran liegts hab ich grade selber gemerkt^^

hab parallel ein einfaches doppelgepuffertes projekt versucht und siehe da es geht.
 
Eine Frage hät ich da noch:

Ich hab das jetzt über PaintComponent geregelt und darüber die doppelpufferung laufen, funzt einwandfrei

nur: wann wird, und vor allem von wem, wird dann repaint/paintComponent aufgerufen?

Ich habe jetzt einen eigenen Thread dafür der immer Fein mein Anzeigefenster mit repaint beglückt - weiter habe ich einen ganzzahl FPS zähler - und da habe ich gemerkt, dass die PaintComponent methode noch von irgendwem anders aufgerufen wird...

Der Thread:
Code:
    public void run() {
        aktiv = true;
        
        long Startzeit, Renderzeit, Wartezeit;
         
        while(aktiv) {
            Startzeit = System.currentTimeMillis();
            repaint();
            Renderzeit = System.currentTimeMillis() - Startzeit;
            Wartezeit = Renderperiode_ms - Renderzeit; //Renderperiode_ms = 33! Möchte 30FPS haben
            if (Wartezeit < 5) {Wartezeit = 5;} //Der Thread muss auchmal Pause machen :)
          
            try {
                Thread.sleep(Wartezeit);    // Versuchen zu warten, dass andre 
                                            // Prozesse auch was von der Zeitscheibe
                                            // abbekommen. :]
            }
            catch(InterruptedException e) {/* Mach nix*/}
        }
        System.exit(0);
    }

Mein PaintComponent():
Code:
   long erstesFrame, aktuellesFrame;
    int frames, fps;
    
    @Override
    public void paintComponent(Graphics g) {
        rendern();        
        frames++;
        aktuellesFrame = System.currentTimeMillis();
        if(aktuellesFrame > erstesFrame + 1000){
            erstesFrame = aktuellesFrame;
            fps = frames;
            frames = 0;
        }
        g.drawImage(BufferBild, 0, 0, null);
        g.setColor(Color.YELLOW);
        g.drawString(fps +" FPS", 10, 20); 
    }

ist es nun technisch besser mit repaint oder mit paintComponent() zu arbeiten im Thread.run?

So das war der erste Streich.

Mein zweites Problem.

Ich male Bilder in ein JPanel hinein. wie könnte man die Anklickbar machen. Das Problem ist, es sind zwar quadratische Bilder aber mit Rautenbild, ich muss sie überlappen um den Anschein einer hübschen Ebene zu erzeugen. Hier ein Ausschnitt davon:
iso2.PNG

Ich möchte eben die einzelnen Felder per Maus ansteuerbar machen/auswählen können
Die einzelnen Felder sind mithilfe eines Editors ändernbar also "höhe", aussehen und betretbarkeit (für die blauen Blobs zum Beispiel) Derzeit funktioniert die Ansteuerung der einzelnen Felder mit der Tastatur was aber seehr unbequem ist
(Nicht wundern wenn diese Blobs da so unmöglich schief verteilt scheinen, ist eine Aufnahme der Animation, und einige hüpfen grad von feld zu feld, der Blob mit der 0 übern Kopf löst sich jeden Moment auf, seine "Lebenszeit" ist vorbei)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben