Probleme mit JMenu in einem JFrame mit BufferStrategy

Skipy

Mitglied
Hi,

ich programmiere gerade mit ein paar Freunden an einem Java-Spiel. Es ist ein Brettspiel. Als GUI wollen wir ein JFrame verwenden mit der JMenueBar oben. Das Spielbrett selbst zeichnet sich dann auf diese GUI drauf. Da die Steine des Spielbrettes animiert sind, müssen wir die Zeichenmethode zyklisch aufrufen, ...
Damit es nicht so ruckelt verwenden wir BufferStrategy

Jetzt habe ich eben versucht ein JMenu einzubauen, doch es will sich einfach nicht zeichnen. Ich habe jetzt schon ein ganzes Weilchen gegoogelt und herausgefunden das es eventuell an sogenannten "heavy" und "light" Komponenten liegen könnte. (Siehe Mixing heavy and light components )

Weitere Fehlerquellen könnten sein:
- falsche Verwendung von Thread
- falsche Verwendung von JMenu
- falsche Verwendung von BufferStrategy

Das hier ist mal die Klasse fuer die Oberflaeche
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package GUI;

import interfaces.OberflaecheInterface;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.ToolTipManager;
import logo.LoGoApp;


/**
 *
 * @author steven
 * @version 0.2
 */
public class TestOberflaeche extends JFrame implements Runnable, KeyListener, OberflaecheInterface, MouseListener, ActionListener{

    // Wenn nicht anders angegeben, verwende diese Masse zum zeichnen des Spielbretts
    private final static int STANDARD_SPIELFELD_HOEHE = 495;
    private final static int STANDARD_SPIELFELD_BREITE = 495;
    private final static int STANDARD_SPIELFELD_XPOS = 40;
    private final static int STANDARD_SPIELFELD_YPOS = 40;

    private boolean threadLaeuf;
    private static boolean once = false;


    // GUI-Teile
    private Spielbrett dasBrett;
    protected JMenuBar dieMenueBar;
    protected JMenuItem Einstellungen;
    protected JMenuItem UeberLoGo;
    protected JMenuItem SpielLaden;
    protected JMenuItem SpielSpeichern;
    protected JMenuItem Undo;
    protected JMenuItem Redo;

   /* Double Buffering */
    String mess = "";

    public TestOberflaeche( String pFenstername ){
        super( pFenstername );

        init();
        
        this.start();
    }


    public void init(){

        // Schwere und leichte Komponenten
        JPopupMenu.setDefaultLightWeightPopupEnabled( false );
        ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);
        
        /* Buffern */
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	//this.setUndecorated(true);
	this.setSize(800,600);
        setLocationRelativeTo(null); // Fenster zentrieren
        //this.setResizable(false);
	this.setVisible(true);
        //this.setBackground(Color.ORANGE);
	this.createBufferStrategy(2);

        // Menue-Bar erstellen
        createMenue( this );

        threadLaeuf = true;

        // Alle Spezialbuttons wie TAB, werden wie normale Keys behandelt
        this.setFocusTraversalKeysEnabled(false);
        this.addKeyListener(this);
        this.addMouseListener(this);

        // Programm bei klick auf den roten Knopf beenden
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public void createMenue( JFrame f){
    
        dieMenueBar = new JMenuBar();

        // ------ LoGo-Menue -------
        JMenu dasLoGoMenue = new JMenu( "LoGo" );

	// Einstellungen
	Einstellungen = new JMenuItem( "Einstellungen" );
	Einstellungen.addActionListener( this );
	setMenuAccelerator( Einstellungen, ',' );
	dasLoGoMenue.add( Einstellungen );

        // Ueber
        UeberLoGo = new JMenuItem ("Über LoGo");
        UeberLoGo.addActionListener(this);
        setMenuAccelerator(UeberLoGo, 'a');
        dasLoGoMenue.add(UeberLoGo);

        // ------ Spiel-Menue -------
        JMenu dasSpielMenue = new JMenu( "Spiel" );

	// Spiel Laden
	SpielLaden = new JMenuItem( "Spiel laden" );
	SpielLaden.addActionListener( this );
	setMenuAccelerator( SpielLaden, 'l' );
	dasSpielMenue.add( SpielLaden );

        // Spiel Speichern
        SpielSpeichern = new JMenuItem ("Spiel speichern");
        SpielSpeichern.addActionListener(this);
        setMenuAccelerator(SpielSpeichern, 's');
        dasSpielMenue.add(SpielSpeichern);

        // Trenner
        dasSpielMenue.addSeparator();

        // Spielzug Undo
	Undo = new JMenuItem( "Spiel laden" );
	Undo.addActionListener( this );
	setMenuAccelerator( Undo, 'l' );
	dasSpielMenue.add( Undo );

        // Spielzug Redo
        Redo = new JMenuItem ("Spiel speichern");
        Redo.addActionListener(this);
        setMenuAccelerator(Redo, 's');
        dasSpielMenue.add(Redo);


        dieMenueBar.add(dasLoGoMenue);
        dieMenueBar.add(dasSpielMenue);
        f.setJMenuBar( dieMenueBar );
    }

    protected void setMenuAccelerator(JMenuItem pMenuItem, char pMnemonic) {
	// Bei Windows und Linux mit STR, bei Apple mit Apfel
	KeyStroke ks = KeyStroke.getKeyStroke( pMnemonic, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() );
	pMenuItem.setAccelerator( ks );
}

    public void run() {
        long startTime = System.nanoTime();
        long cumTime = startTime;

        while(this.threadLaeuf){
            long timePassed = System.nanoTime() - cumTime;
            cumTime += timePassed;

            this.doLogic(timePassed);
            //this.repaint();
            this.drawStuff();
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {}
        }
    }

    private void drawStuff() {
	BufferStrategy bf = this.getBufferStrategy();
	Graphics g = null;

	try {
		g = bf.getDrawGraphics();

                g.setColor(this.getBackground());
                g.fillRect(0, 0, this.getWidth(), this.getHeight());

		// It is assumed that mySprite is created somewhere else.
		// This is just an example for passing off the Graphics object.
                if(this.dasBrett != null)
                    this.dasBrett.drawObjects(g);

                g.setColor(Color.BLACK);
                g.setFont(new Font("Arial", Font.PLAIN, 20 ));
                g.drawString("MESS: "+mess, 30, 50);

	} finally {
		// It is best to dispose() a Graphics object when done with it.
		g.dispose();
	}

	// Shows the contents of the backbuffer on the screen.
	bf.show();

        //Tell the System to do the Drawing now, otherwise it can take a few extra ms until
        //Drawing is done which looks very jerky
        Toolkit.getDefaultToolkit().sync();
}

    @Override
    public void update( Graphics g){
    }

    public void start(){
        // Thread anstoßen
        if ( !once ) {
            once = true;
            Thread t = new Thread( this );
            t.start();
	}
    }

    public void stop(){
        this.threadLaeuf = false;
    }



    public synchronized void doLogic( long timePassed ){
        if(this.dasBrett != null)
            this.dasBrett.doLogic(timePassed);
    }

    public void keyTyped(KeyEvent e) {
        e.consume();
    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_ESCAPE){
            this.stop();
        }
        else if(keyCode == KeyEvent.VK_N){
            // neues Spiel
            LoGoApp.meineSteuerung.buttonSpielStarten();
            mess = "Steuerung => Spiel starten";
        }
        else if( keyCode == KeyEvent.VK_LEFT){
            LoGoApp.meineSteuerung.buttonUndo();
            mess = "Zug Rückgängig machen";
        }
        else if( keyCode == KeyEvent.VK_RIGHT){
            LoGoApp.meineSteuerung.buttonRedo();
            mess = "Zug wieder herstellen";
        }
        else{
            mess = "Pressed: " + KeyEvent.getKeyText(keyCode);
            e.consume(); // Kombinierte Tasten sollen nicht behandlet werden.
        }
    }

    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        mess = "Released: " + KeyEvent.getKeyText(keyCode);
        e.consume();
    }

    public void setBrettOberflaeche(int[][] spielfeld, int spielfeldGroesse) {
        // ACHTUNG: Änderun der Spielfeldgroesse wird hier nciht abgefangen!
        if(this.dasBrett != null && this.dasBrett.getAnzahlFelder() == spielfeldGroesse){
            this.dasBrett.updateSpielFeld(spielfeld);
        }
        else{
            this.dasBrett = new Spielbrett(STANDARD_SPIELFELD_BREITE,
                    STANDARD_SPIELFELD_HOEHE, 
                    STANDARD_SPIELFELD_XPOS, 
                    STANDARD_SPIELFELD_YPOS, 
                    spielfeldGroesse, 
                    GrafikLib.getInstance().getSprite("GUI/resources/brett_bg.png"));
        }

    }

    public void setAnzeigePeriodenZeitWeiss(long periodenZeitInMS) {
    }

    public void setAnzeigePeriodenZeitSchwarz(long periodenZeitInMS) {
    }

    public void setAnzeigeSpielerZeitWeiss(long spielerZeitInMS) {
    }

    public void setAnzeigeSpielerZeitSchwarz(long spielerZeitInMS) {
    }

    public void setSpielernameWeiss(String spielername) {
    }

    public void setSpielernameSchwarz(String spielername) {
    }

    public void setGefangeneSteineWeiss(int anzGefangenerSteiner) {
    }

    public void setGefangeneSteineSchwarz(int anzGefangenerSteiner) {
    }

    public void setSchwarzAmZug() {
    }

    public void setWeissAmZug() {
    }

    public void gibFehlermeldungAus(String fehlertext) {
        System.out.println(fehlertext);
    }

    public void mouseClicked(MouseEvent e) {
        if( this.dasBrett != null ){
            Point returnWert = this.dasBrett.berechneTreffer(e.getX(), e.getY());
            if( returnWert != null){
                LoGoApp.meineSteuerung.klickAufFeld(returnWert.x, returnWert.y);
                mess = "klick auf " + returnWert.x + " |*" + returnWert.y;
            }else{
                mess = "kein Treffer mit Clicked-Koordinaten: " + e.getX() + " |*" + e.getY();
            }
        }
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


}


Über eure Hilfe wäre ich euch mal wieder sehr dankbar!

Viele Grüße,
Skipy
 

EdelStoff

Mitglied
Hi,

probier mal
Java:
this.setVisible(true);
nach
Java:
createMenue( this );
aufzurufen.

setVisible() sollte immer am Ende stehen, nachdem alle Komponenten hinzugefügt wurden.
 

Skipy

Mitglied
Hallo EdelStoff, danke für die Hinweise.

Ich konnte ein paar der Probleme mittlerweile (unter anderem dank deiner Hilfe) lösen :)

Zum einen musste in der init() Methode, wie du gesagt hast, das erstellen des Menues ganz nach oben, damit es auch immer gleich von Anfang an angezeigt wird.
Java:
    public void init(){
        // Menue-Bar erstellen
        createMenue( this );

        // Schwere und leichte Komponenten
        JPopupMenu.setDefaultLightWeightPopupEnabled( false );
       //  ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);
        
        /* Buffern */
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	//this.setUndecorated(true);
	this.setSize(800,600);
        setLocationRelativeTo(null); // Fenster zentrieren
        //this.setResizable(false);
	this.setVisible(true);
        this.setBackground(Color.ORANGE);
	this.createBufferStrategy(2);

        threadLaeuf = true;

        // Alle Spezialbuttons wie TAB, werden wie normale Keys behandelt
        this.setFocusTraversalKeysEnabled(false);
        this.addKeyListener(this);
        this.addMouseListener(this);

        // Programm bei klick auf den roten Knopf beenden
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

außerdem musste ich in drawStuff() die paint-Methode aus der Superklasse noch aufrufen, damit das Menü gezeichnet wird.
Java:
private void drawStuff() {
	BufferStrategy bf = this.getBufferStrategy();
	Graphics g = null;

	try {
		g = bf.getDrawGraphics();


                super.paint(g);
                // g.setColor(this.getBackground());
                // g.fillRect(0, 44, this.getWidth(), this.getHeight());
                
                if(this.dasBrett != null)
                    this.dasBrett.drawObjects(g);

                g.setColor(Color.BLACK);
                g.setFont(new Font("Arial", Font.PLAIN, 20 ));
                g.drawString("MESS: "+mess, 55, 560);

	} finally {
		// Am Ende Disposen ist am besten ;)
		g.dispose();
	}

	// Shows the contents of the backbuffer on the screen.
	bf.show();

        //Tell the System to do the Drawing now, otherwise it can take a few extra ms until
        //Drawing is done which looks very jerky
        Toolkit.getDefaultToolkit().sync();
}

Allerdings gibt es jetzt immer noch ein Problem mit dem Hintergrund. Hier ist der Hintergrund Orange eingestellt. Das sieht auch ganz richtig aus so: http://img59.imageshack.us/img59/9748/bildschirmfoto20100417u.png

Sobald dich jetzt aber das menue anklicke, wechselt die Farbe wieder in grau?! ... Und das obwohl Backgroundcolor auf Orange gestellt ist. http://img696.imageshack.us/img696/1930/bildschirmfoto20100417uz.png
Wenn ich das Ganze nochmal mit einem Rechteck übermale (im Quellcode hier auskommentiert) dann geht es. Aber gibt es da keine saubere Lösung? :)

Viele Grüße und danke für eure Hilfe,
Skipy
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Scaling Probleme Spiele- und Multimedia-Programmierung 6
J Probleme bei Pong Spiele- und Multimedia-Programmierung 9
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
J YoutubeAPI Livestream probleme Spiele- und Multimedia-Programmierung 3
G [LibGDX] Button Klick Probleme Spiele- und Multimedia-Programmierung 1
T Probleme mit JButton Spiele- und Multimedia-Programmierung 5
T Probleme bei "Pixel-Fighting"-Spiel: Unausgewogene Mannschaften??? Spiele- und Multimedia-Programmierung 4
P Probleme mit VLCJ Spiele- und Multimedia-Programmierung 0
F Probleme bei der Soundwiedergabe Spiele- und Multimedia-Programmierung 0
S Probleme bei Breakout - Brick kollision Spiele- und Multimedia-Programmierung 2
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F BlueJ Ufospiel Probleme Spiele- und Multimedia-Programmierung 1
B Probleme mit AndEngine in Android Spiele- und Multimedia-Programmierung 1
M 2048, 3 kleine Probleme Spiele- und Multimedia-Programmierung 4
A Probleme mit Darstellung von Umgebungen mittels mehrdimensionaler Arrays Spiele- und Multimedia-Programmierung 8
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
J Perfomance Probleme beim eigenen Editor Spiele- und Multimedia-Programmierung 1
K Probleme beim kompilieren von javakara Spiele- und Multimedia-Programmierung 10
Q LWJGL - Alpha-Probleme Spiele- und Multimedia-Programmierung 2
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
K Probleme mit .jar Spiele- und Multimedia-Programmierung 12
L Probleme beim kompilieren von javakara Spiele- und Multimedia-Programmierung 3
D Probleme mit der Runnable jar Datei Spiele- und Multimedia-Programmierung 3
D Probleme mit objekt initializirung mit Mouselistener Spiele- und Multimedia-Programmierung 10
Black_ixx Hintergrund & Koordinaten Probleme Spiele- und Multimedia-Programmierung 2
B Probleme mit Texturen Spiele- und Multimedia-Programmierung 7
Maxim6394 Probleme bei Sidescroller Spiele- und Multimedia-Programmierung 5
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
Maxim6394 [Java3D] Probleme bei Kollision Spiele- und Multimedia-Programmierung 7
Maxim6394 [Java3D] Probleme mit KeyFrame Animationen Spiele- und Multimedia-Programmierung 9
T Probleme mit Skysphere in Opengl Spiele- und Multimedia-Programmierung 4
B Probleme mit redraw() Spiele- und Multimedia-Programmierung 3
Gossi Quaxlis 2D Tutorial....Probleme nach hinzufügen der Kollisionsabfrage Spiele- und Multimedia-Programmierung 16
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
S Probleme mit Tutorial Spiele- und Multimedia-Programmierung 3
T Probleme mit AffineTransform Spiele- und Multimedia-Programmierung 13
W Probleme mit Mouselook Spiele- und Multimedia-Programmierung 2
B GameGrid Probleme mit mehrere Actors Spiele- und Multimedia-Programmierung 5
B GameGrid Probleme mit mehrere Actors Spiele- und Multimedia-Programmierung 2
M [Spiel] Kartenspiel Leben und Tod Tips und Probleme Spiele- und Multimedia-Programmierung 7
G [Java3D] Probleme bei Animation Spiele- und Multimedia-Programmierung 4
Steev Probleme mit Kameraausrichtung bei ISO-Map Spiele- und Multimedia-Programmierung 3
R MediaPlayer macht Probleme Spiele- und Multimedia-Programmierung 2
N Jogl Probleme mit dem Buffer beim laden einer Textur Spiele- und Multimedia-Programmierung 2
prakdi Probleme mit Quaxlis tutorial Spiele- und Multimedia-Programmierung 5
D Java Pong Probleme Spiele- und Multimedia-Programmierung 7
T Java Sound Probleme Spiele- und Multimedia-Programmierung 8
P probleme mit key event Spiele- und Multimedia-Programmierung 11
T Bekanntes Heli Spiel -> Aber Probleme damit Spiele- und Multimedia-Programmierung 30
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
O Ampel - Probleme mit der Farbgebung Spiele- und Multimedia-Programmierung 16
F Probleme bei Bewegung Spiele- und Multimedia-Programmierung 7
P Probleme mit Vista und JOGL Spiele- und Multimedia-Programmierung 2
P Probleme mit Wolkenbewegung Spiele- und Multimedia-Programmierung 5
W Probleme mit dem setTextureCoordinate Spiele- und Multimedia-Programmierung 3
D Probleme beim Download von GIF-Bildern Spiele- und Multimedia-Programmierung 4
S Probleme mit dem Licht und dem KeyListener Spiele- und Multimedia-Programmierung 2
L Probleme Bei Pong Programmierung Spiele- und Multimedia-Programmierung 2
D Probleme bei ATI Karten bekannt? Spiele- und Multimedia-Programmierung 4
H Probleme bei Rotation Spiele- und Multimedia-Programmierung 9
X Probleme. Spiele- und Multimedia-Programmierung 2
E Probleme mit Kollisionserkennung ! Spiele- und Multimedia-Programmierung 2
F Probleme mit selbsterstelltem transparenten PNG Spiele- und Multimedia-Programmierung 5
S probleme mit material Spiele- und Multimedia-Programmierung 2
W Probleme beim entfernen von Childs im HauptSceneGraph Spiele- und Multimedia-Programmierung 8
N Pong - noch 2 kleinere Probleme Spiele- und Multimedia-Programmierung 16
M Probleme mit WaveFront-Object - Datei Spiele- und Multimedia-Programmierung 7
B Probleme beim zeichnen Spiele- und Multimedia-Programmierung 15
D Gomoku --- Probleme bei Instanzierung Spiele- und Multimedia-Programmierung 2
G Probleme beim installieren java 3d linux Spiele- und Multimedia-Programmierung 4
G Sound Probleme Spiele- und Multimedia-Programmierung 2
S Probleme mit Canvas! Spiele- und Multimedia-Programmierung 2
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
C Probleme mit Java3D (sun.awt.DrawingSurface) in Java 5 Spiele- und Multimedia-Programmierung 10
R Probleme mit Sound in Applikation. HILFE Spiele- und Multimedia-Programmierung 5
N Probleme mit View Spiele- und Multimedia-Programmierung 3
M Paint überzeichnet JMenu Spiele- und Multimedia-Programmierung 3
E Rendering order auf einem ismetrischen Grid Spiele- und Multimedia-Programmierung 8
P Wie kann ich einem Programm hinter eine GUI verstecken? Spiele- und Multimedia-Programmierung 12
J (Libgdx) animation nur einmal in einem Event aufrufen Spiele- und Multimedia-Programmierung 1
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G Entity Verwaltung in einem 2D Spiel Spiele- und Multimedia-Programmierung 1
G Collision Detection in einem 2D Sandbox Game. Spiele- und Multimedia-Programmierung 2
E Einem A*-Pfad folgen Spiele- und Multimedia-Programmierung 27
G Auf einem Stick bewegen Spiele- und Multimedia-Programmierung 5
windl MP3-Tags von einem Inputstream auslesen Spiele- und Multimedia-Programmierung 5
U DPI von einem Bild definieren Spiele- und Multimedia-Programmierung 5
X Erklärung zu einem Tic Tac Toe Spiel Spiele- und Multimedia-Programmierung 1
C Hilfe bei einem Mosaikspiel Spiele- und Multimedia-Programmierung 16
M [JOGL] Maus über einem gezeichnetem Objekt abfragen? Spiele- und Multimedia-Programmierung 5
P Winkel von einem Punkt zum anderen berechnen Spiele- und Multimedia-Programmierung 9
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
S Java3D: Primitives zu einem Objekt kombinieren Spiele- und Multimedia-Programmierung 7
Fl4sh1 Datum und Uhrzeit von einem Ereignis ausgeben lassen Spiele- und Multimedia-Programmierung 3
P Frage zu einem Projekt "Einarmiger Bandit" 3 Walzen / 9 Zeichnungen BLUEJ Spiele- und Multimedia-Programmierung 10
K Grundsätzlicher Spieleaufbau an (m)einem Beispiel Spiele- und Multimedia-Programmierung 4
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
M Farbwerte für Flächen aus einem Bild erkennen Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben