Probleme mit JMenü und Grafik

Schecter

Neues Mitglied
Hallo,

ich bin grade am Anfang ein kleines Hangman Programm zu schreiben und bin bei meinem Startfenster auf folgende Probleme gestoßen:

1. Die Menüleiste wird einfach nicht angezeigt
2. Wie kann ich die 3 Button nach unten verschieben und oben eine Grafik einfügen?

Ich wäre sehr dankbar für eure Hilfe


Hier mal mein bisheriger Quellcode

Java:
package Projekt;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;


public class Spielfeld extends JFrame implements ActionListener

{

	public static void main (String[] args) 
	

	{	
	
		JFrame startfenster = new JFrame();
		
		startfenster.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		startfenster.setSize(1000,1000);
		startfenster.setLocation(200,200); //in die Mitte setzen

		
		JPanel einPanel = new JPanel();
		einPanel.setSize(100,100);
		einPanel.setLayout( new GridLayout(3,1) );
		einPanel.setBackground( Color.BLACK);
		//hier ein Image einfügen
		
		JButton button = new JButton( "NEUES SPIEL");
		button.setSize(100,100);
		einPanel.add( button );
		
		JButton button1 = new JButton ("Spielregeln");
		einPanel.add( button1);
		
		JButton button2 = new JButton ("Spiel beenden");
		einPanel.add( button2);
		
		
		startfenster.add( einPanel );
		startfenster.setVisible( true);
		
		}
	
	
	
	  private void erzeugeMenue()
	  {
	
	    JMenuItem mi_neu = new JMenuItem( "Neues Spiel" );
	    mi_neu.setActionCommand( "neuesSpiel" );
	    mi_neu.addActionListener( this );

	    JMenuItem mi_ende = new JMenuItem( "Ende" );
	    mi_ende.setActionCommand( "ende" );
	    mi_ende.addActionListener( this );
	    
	    JMenu m_spiel = new JMenu( "Spiel" );
	    m_spiel.add( mi_neu );
	    m_spiel.add( mi_ende );
	    
	    JMenuBar dieMenueleiste = new JMenuBar();
	    dieMenueleiste.add( m_spiel );
	    dieMenueleiste.setVisible(true);
	  
	    
	}
}
 
Warum leitest du die Klasse von JFrame ab, wenn du das nicht mal ausnutzt?

Zur Frage: Das Menü wird mit der Methode setJMenuBar des JFrames sichtbar gemacht.
Weißt du wie man zeichnet? Ich würde ein Panel einfügen und auf das das Bild zeichnen.
Dafür musst du das Gridlayout aber nochmal anpassen.

Edit: Ich würde es ungefähr so lösen:

1. Es wird keine Instanz von JFrame erstellt, sondern von deiner Klasse.
Das bedeutet, dass du den ganzen Kram aus main in den Konstruktor verschieben kannst.
2. Ein Vorteil ist, dass du jetzt einfach mit setJMenuBar das Menü setzen kannst, und zwar mit Hilfe der Methode erzeugeMenue().

(Habe mir erlaubt das Fenster zu zentrieren und die Größe relativ zum Bildschirm anzugeben)

Java:
package Projekt;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
 
 
public class Spielfeld extends JFrame implements ActionListener{
	
	public static void main(String[] args){
		Spielfeld f = new Spielfeld();
	}
	
    public Spielfeld(){
    	setJMenuBar(erzeugeMenue());
        
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        centerWindow();
        
        JPanel einPanel = new JPanel();
        einPanel.setSize(100,100);
        einPanel.setLayout( new GridLayout(4,1) );
        einPanel.setBackground( Color.BLACK);
        
        String pfad = "img-pfad";
        File f = new File(pfad);
        
        einPanel.add(new Leinwand(openImage(f)));
        
        JButton button = new JButton( "NEUES SPIEL");
        button.setSize(100,100);
        einPanel.add( button );
        
        JButton button1 = new JButton ("Spielregeln");
        einPanel.add( button1);
        
        JButton button2 = new JButton ("Spiel beenden");
        einPanel.add( button2);
        
        
        getContentPane().add( einPanel );
        setVisible( true);
     }
    
    private BufferedImage openImage(File f){
		try {
			BufferedImage img = ImageIO.read(f);
			return img;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
    }
    
    class Leinwand extends JPanel{
    	BufferedImage img;
    	
    	public Leinwand(BufferedImage img){
    		this.img = img;
    	}
    	
    	public void paintComponent(Graphics g){
    		g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    	}
    }
    
	private void centerWindow(){
		Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize();		
		int width, height, x, y;
		
		width = (int) (d.getWidth()*0.5) ;
		height = (int) (d.getHeight()*0.5);
		x = (int) ((d.width - width) / 2);
		y = (int) ((d.height - height) / 2);
		
		setSize(width, height);
		setLocation(x, y);
	}
   
      private JMenuBar erzeugeMenue()
      {
    
        JMenuItem mi_neu = new JMenuItem( "Neues Spiel" );
        mi_neu.setActionCommand( "neuesSpiel" );
        mi_neu.addActionListener( this );
 
        JMenuItem mi_ende = new JMenuItem( "Ende" );
        mi_ende.setActionCommand( "ende" );
        mi_ende.addActionListener( this );
        
        JMenu m_spiel = new JMenu( "Spiel" );
        m_spiel.add( mi_neu );
        m_spiel.add( mi_ende );
        
        JMenuBar dieMenueleiste = new JMenuBar();
        dieMenueleiste.add( m_spiel );
        dieMenueleiste.setVisible(true);
      
        return dieMenueleiste;
    }

	@Override
	public void actionPerformed(ActionEvent arg0) {
		
	}
}
 
Zuletzt bearbeitet:
@Schecter: Versuche wenn möglich englische Variable/Konstanten/Klassennamen zu verwenden. Wenn du das mit den Englischen aus der Standart-Lib vermischt kommt am Ende irgend ein Kauderwelsch heraus. Zudem wären bessere Variablennamen angebracht. "button, button1" usw. sind unverständlich. Außerdem solltest du pack zum Größe setzen verwenden. 1000 px² wären bei mir nicht mal vollständig darstellbar. Und GUI-Änderungen nimmt man unter Swing ausschließlich im EDT vor.

@Monaria: JFrame#setLocationRelativeTo kann automatisch in Bildschirmmitte zentrieren.
 

Zurück
Oben