Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Probleme mit Swing

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.05.2001
    Ort
    Emden
    Beiträge
    30

    Probleme mit Swing

    Moinsen Leute!

    Seit zwei Tagen beschäftige ich mich zum ersten Mal mit Swing unter Java.
    Bis dato war ich nur auf der Konsole mit kleinen Sachen tätig.

    Nun aber folgendes Problem.
    Ich habe zunächst eine Menüleiste mit Items eingefügt. Funktioniert tadellos. Nun wollte ich mittels public void paint(Graphics g) einfache Sachen zeichnen. Beispielsweise mit [B]drawRect[B] irgendwas. Sobald ich aber nur public void paint(Graphics g) { } so eingebaut habe und das Programm starte, wird die Menüleiste nicht mehr angezeigt. Ich kann jene zwar noch blind anwählen, doch das ist ja auch nicht das Wahre. Ist bestimmt nur ein Anfängerfehler. Die Menübar wird also vom Zeichenfeld überdeckt.
    Doch wie und wo mache ich es besser?

    Ich habe jedenfalls mal den Code beigelegt.

    Code:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.Component.*;
    import javax.swing.*;
    
    
    
    public class MainFrame extends JFrame implements ActionListener 
    {
    	
    	
    	public MainFrame()
    	{
    		super("Mission One");
    				
    		/****** Menü-Einträge erstellen ******/
    		
    		JMenu		dateiMenu, optMenu, aboutMenu;
    		JMenuBar	mBar;
    		JMenuItem	mi;
    		
    		/* Menüpunkt 1 */
    		dateiMenu = new JMenu("Datei");
    		mi		  = new JMenuItem("Neues Spiel");
    		mi.addActionListener(this);
    		dateiMenu.add(mi);
    		dateiMenu.addSeparator();			/* Trennstrich */
    		mi    	  = new JMenuItem("Exit");
    		mi.addActionListener(this);
    		dateiMenu.add(mi);
    		
    		/* Menüpunkt 2 */
    		optMenu   = new JMenu("Optionen");
    		mi		  = new JMenuItem("Mensch vs. Mensch");
    		mi.addActionListener(this);
    		optMenu.add(mi);		
    		mi		  = new JMenuItem("Mensch vs. Computer");
    		mi.setEnabled(false);
    		mi.addActionListener(this);
    		optMenu.add(mi);
    		
    		/* Menüpunkt 3 */
    		aboutMenu = new JMenu("Info");
    		mi        = new JMenuItem("About");
    		mi.addActionListener(this);
    		aboutMenu.add(mi);
    		
    		/* alles zusammenklatschen */		
    		mBar      = new JMenuBar();
    		mBar.add(dateiMenu);
    		mBar.add(optMenu);
    		mBar.add(aboutMenu);
    		setJMenuBar(mBar);
    		
    		
    		/********** Einstellungen für das Frame selbst ******/
    		setSize(700, 600);
    		setLocation(200,150);
    		setVisible(true);
    		setResizable(false);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* sollte man so machen */
    		
    		
    		
    	}
    	
    	public void actionPerformed(ActionEvent event)
    	{
    		String cmd = event.getActionCommand();
    		if (cmd.equals("Exit"))
    			System.exit(0);
    		
    		/* AboutBox wird gerufen */
    		if(cmd.equals("About"))
    		{
    			AboutBox aboutDlg = new AboutBox(this);
        		aboutDlg.show();
    		}
    	}
    	
    	public void paint(Graphics g)
    	{
    		g.drawRect(20,20,500,500);
    	}
    	
    	/* main */
    	public static void main(String[] args)
    	{
    		MainFrame frame1 = new MainFrame();
    		frame1.show();
    		frame1.repaint();
    		
    	}	
    }
    Fragende Grüße

    Torsten
    104 Tasten Maus.
    Tastatur mit Scrollrad

  2. #2
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Das ist jetzt der Punkt, an dem du dir Gedanken über sinnvolles Layouten deiner Oberfläche machen solltest.

    Ich würde z.B. einen Bereich nur für das Menü definieren. Da dieser dann getrennt vom Rest der Fensterfläche ist kann er durch Zeichen auch nicht überschireben werden.

    Code:
    setLayout( new BorderLayout() );     // für das Hauptfenster
    
    Panel MenuArea = new Panel( );       // ein Panel nur für das Menü erstellen
    add( MenuArea, BorderLayout.NORTH);  // das Panel in den Norden setzen
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.06.2002
    Beiträge
    18
    hallo Mad,

    Du überschreibst die gesamte methode paint() . durch diese methode wird jedoch die gesamte graphikausgabe (also auch die menüdarstellung) gemacht. somit wird nun statt der graphikausgabe nur noch Dein code -- und somit keine menüdarstellung -- mehr ausgeführt.

    Du möchtest jedoch, dass die originäre graphikausgabe und Dein code ausgeführt werden.

    dazu solltest Du, wie von boron angeregt, ein eigenes widget definieren, und dessen -- und nur dessen -- paint methode überschreiben.

    viele grüße,
    kit

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wahrscheinlich geht es auch, wenn du in paint die Implementation der Basisklasse aufrufst.

    also
    Code:
            public void paint(Graphics g)
            {
                    g.drawRect(20,20,500,500);
    		super.paint(g);
            }
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •