[Java] JMenuBar weergeven

Pagina: 1
Acties:
  • 139 views sinds 30-01-2008
  • Reageer

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Hallo,

Ik speel normaal in Java altijd met AWT maar laatst ben ik eens het een en ander in Swing gaan proberen. Ik ben dus een complete leek wat Swing betreft.

Nu wou ik graag een JMenuBar in een applicatie weergeven.
Dit menu laat ik in de contructor van het programma maken.
Vervolgens wordt in de main methode een frame van de constructor gemaakt. Ik gebruik verder geen JPanels of Containers omdat ik simpelweg niet weet wat ik ermee zou moeten. Lees al een paar dagen tutjes door maar heb het nog niet door.
Nu kan ik het programma gewoon compilen en runnen alleen wordt de menubar niet weergegeven. Ik heb al van alles geprobeerd maar geen enkele oplossing heeft een goed resultaat.

Wat doe ik verkeerd en hoe zou het wel moeten?
Is er een bepaalde hierarchie die ik moet aanhouden?

Ik zal iig mijn code geven zodat jullie ook weten waar ik over praat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
///////////////////
// 100% JCreator //
///////////////////

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Interface extends JFrame {
    
    private Image            image   = Toolkit.getDefaultToolkit().getImage("interface.gif");
    private BorderLayout     layout  = new BorderLayout();
            
      public Interface() {
          
        super("Interface");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
        
        JMenuBar menu = new JMenuBar();
        setJMenuBar(menu);
        // Maak De hoofdmenus aan
      JMenu spel =       new JMenu("Spel");
        JMenu   opties =     new JMenu("Opties");
        JMenu   help =       new JMenu("Help");
        menu.add(spel);
        menu.add(opties);
        menu.add(help);
        // Maak een submenu aan
        JMenu    opties4 =   new JMenu("Uiterlijk");
        // Spel-menu
        JMenuItem spel1 =    new JMenuItem("1 Speler");
        JMenuItem spel2 =    new JMenuItem("2 Spelers");
        JMenuItem spel3 =    new JMenuItem("Stop");
        JMenuItem spel4 =    new JMenuItem("Afsluiten");
        spel.add(spel1);
        spel.add(spel2);
        spel.add(spel3);
        spel3.setEnabled(false);
        spel.addSeparator();
        spel.add(spel4);
        // Optie-menu
        JMenuItem opties1 =  new JMenuItem("Console");
        JMenuItem opties2 =  new JMenuItem("Spel opties");
        JCheckBoxMenuItem opties3 = new JCheckBoxMenuItem("Geluid",true);
        JMenuItem opties5 =  new JMenuItem("HighScores");
        opties.add(opties1);
        opties.add(opties2);
        opties.add(opties3);
        opties.add(opties4);
        opties.add(opties5);
        // Help-menu
        JMenuItem help1 =    new JMenuItem("Help");
        JMenuItem help2 =    new JMenuItem("About");
        help.add(help1);
        help.add(help2);
        // Uiterlijk-menu
        ButtonGroup groep     = new ButtonGroup();
        JRadioButtonMenuItem uiterlijk;
        uiterlijk = new JRadioButtonMenuItem("Standaard");
        uiterlijk.setSelected(true);
        groep.add(uiterlijk);
        opties4.add(uiterlijk);
        
        uiterlijk = new JRadioButtonMenuItem("Metal");
        groep.add(uiterlijk);
        opties4.add(uiterlijk);
        
        uiterlijk = new JRadioButtonMenuItem("G-Nome");
        groep.add(uiterlijk);
        opties4.add(uiterlijk);
        
        uiterlijk = new JRadioButtonMenuItem("Windows");
        groep.add(uiterlijk);
        opties4.add(uiterlijk);
        
        // Maak sneltoetsen voor de menu's
        // Kijk op http://java.sun.com/products/jdk/1.1/docs/api/java.awt.event.KeyEvent.html voor de diverse toetsen
        spel.setMnemonic(KeyEvent.VK_S);
        opties.setMnemonic(KeyEvent.VK_O);
        help.setMnemonic(KeyEvent.VK_H);
        help1.setMnemonic(KeyEvent.VK_F1);
        // Geef Tooltips weer bij de menu's 
        spel.getAccessibleContext().setAccessibleDescription(
      "Start een nieuw spel of sluit het spel af");
      opties.getAccessibleContext().setAccessibleDescription(
      "Verander het uiterlijk of de spelopties");
        help.getAccessibleContext().setAccessibleDescription(
      "Bekijk de spelregels of de spelcredits");
      
    }

    public static void main(String args[]) {
        
        Interface frame = new Interface();
        // Standaard uiterlijk: 0 = Standaard
        changeInterface(0);
        // De resolutie van het programma
        frame.setSize(800, 623);
        // Geef het programma een naam
        frame.setTitle("Get the Picture");
        // Geef het programma een icoontje
        frame.setIconImage(Toolkit.getDefaultToolkit().getImage("camera.gif"));
        frame.setVisible(true);
        
    }
    
    ...

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 05-09 20:53
Doe het eens andersom? :)

Wat ik bedoel: setJMenuBar als laatste en eerst de JMenuItems maken, dan de JMenu, daar de Items in gooien, en als alle JMenus klaar zijn ze toevoegen aan de JMenuBar.

Ik zie zo snel geen fouten, maar ik kijk gauw over fouten heen zonder code-highlighting..

[edit] Even nagekeken, maar de volgorde maakt niet uit.. even verder zoeken :P

[edit 2]

Afbeeldingslocatie: http://141.252.6.10/kbs/www/temp/koffie.png

Ik heb "changeInterface" weggehaald. Ik heb ook even de code voor de WindowIcon weggehaald omdat ik alleen je code heb en niet je camera.gif. :)

Hij gaf zonder aanpassingen een javac melding op changeInterface(0). Misschien zat je tegen een oudere versie aan te kijken? (de *.class files gooit javac niet weg als hij niet compileerd)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

he HSBOS 1e jaars ;)

Je class Interface noemen vindt ik niet slim aangezien dat een reserved woord in Java is.

Verwijderd

Ik heb hem ook gecompileerd en changeinterface weggehaald en dan comileert hij en zie ik gewoon de menubar!

Get the picture-->HSBOS??

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op zondag 26 mei 2002 19:32 schreef wasigh het volgende:
he HSBOS 1e jaars ;)

Je class Interface noemen vindt ik niet slim aangezien dat een reserved woord in Java is.
LOL, precies.. das een mooie tip..
Ik zal hem even weghalen en kijken..
Enneuh.. jah.. HSBOS :)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Ik heb nu even alle bestanden verwijderd en een nieuw project met een andere naam aangemaakt en doen deed hij hetzelfde.

Waar bleek het aan te liggen.
Ik had ook een methode paint welke een plaatje neerzette.
Als ik dit plaatje weghaalde zat ik nog met hetzelfde probleem.
Pas toen ik de hele methode weghaalde kwamen de menu's tevoorschijn.

Maar het werkt nu dus...
Iedereen bedankt! *D

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Paint in swing is ook niet echt helemaal wat je wilt ;)
Dat heet in swing PaintComponent( Graphics g ) naar ik dacht, maar omdat de boel van awt erf kun je paint nog wel aanroepen, maar werken doet het niet/slecht

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 05-09 20:53
Klopt paintComponent(Graphics g). AWT en Swing layoutcomponenten kun je ook niet zonder meer combineren, maak je applicatie in alleen Swing :) of alleen de klassieke AWT objecten. Let idd op dat je geen gereserveerde woorden gebruikt. Plak er bij twijfel desnoods de naam van je project of app. voor. :)

"Get the Picture" >> GTPMenu, GTPInterface, etc..

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Op zondag 26 mei 2002 20:35 schreef Freak_NL het volgende:
Klopt paintComponent(Graphics g). AWT en Swing layoutcomponenten kun je ook niet zonder meer combineren, maak je applicatie in alleen Swing :) of alleen de klassieke AWT objecten. Let idd op dat je geen gereserveerde woorden gebruikt. Plak er bij twijfel desnoods de naam van je project of app. voor. :)

"Get the Picture" >> GTPMenu, GTPInterface, etc..
:) de naamgeving had ik hier iid al in veranderd (precies nog wel)
Ik neem trouwens aan dat ik behalve de methode paint in paintComponent ook de inhoud van de methode moet veranderen.
Ik zie nu iig geen plaatje tevoorschijn komen.

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 05-09 20:53
Om te painten moet je toch even een JPanel erbij pakken. :P

Die JPanel maak je gewoon zo groot als je JFrame. Je kan bijvoorbeeld je eigen class maken, dit is een class die ik gebruik in een Java bordspel (in ontwikkeling), je kan JPanel vergelijken met een Canvas:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Spelbord extends JPanel implements MouseInputListener, Observer
{
  // static final int (paar dingetjes)
  // private (vars)

  public Spelbord()
  {
    zetBordKlaar ();
  }

  public Spelbord(int b, int h)
  {
    bordBreedte = b;
    bordHoogte = h;
    zetBordKlaar (); 
  }

  private void zetBordKlaar ()
  {
     // implementatie, initialisatie
  }

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    // die regel is nodig!!

    Graphics2D g2d = (Graphics2D)g;
    // optioneel, Graphics2D kan veel meer
    // zie ook op java.sun.com
    g2d.drawImage (bordAchtergrond, 0, 0, this);
    g2d.drawImage (bordHotels, 0, 0, this);
    // etc..
  }

  public void mouseMoved(MouseEvent e)
  {
    // hier doe ik ook iets..
  }

  public void mouseClicked(MouseEvent e)
  {
    // hier doe ik van alles..
  }

  public void mouseDragged(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
}

Ehr.. ik ben Acquire aan het bouwen, implements Observer is niet van belang voor dit voorbeeld. implements MouseInputListener vangt muisacties op deze JPanel af. :Y)

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
woei! Tnx...
Ik ga er direct mee aan de slag

Ik zie dat het vestandig is om voor iedere JPanel een apparte Classe te maken maar hoe roep ik deze vanuit de Classe GTPInterface dan aan?

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 05-09 20:53
Als je een JPanel voor zoiets uitgebreids als je eigen Spelbord nodig hebt is het wel handig om die gewoon uit te breiden (extends). OO is kewl :P

Je kan hem gewoon aanmaken en plaatsen als een JPanel in je JFrame.
code:
1
2
3
4
5
6
7
8
9
class JouwApp extends JFrame
{
  private JPanel spelbord;

  public JouwApp()
  {
    spelbord = new Spelbord();
  }
}

Je kan ook het object wat de muishandelingen moet verwerken meegeven met je Spelbord, zodat die ze weer kan teruggeven in de muisafhandelingsmethodes.

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-08 09:43
Hmm.. dat ziet er minder moeilijk uit dan dat ik het verwacht had :)
Bedankt. Ik ga d'r iets leuks van maken.

-edit-

Ik neem aan dat ik nog wel een container ofzo moet maken.
Dus dan wordt mijn constructor zoiets:
code:
1
2
3
4
5
6
7
8
public GTPInterface(){

   Container container = getContentPane();
   container.setLayout(new BorderLayout());
   speelveld = new Speelveld();
   speelveld.setLayout(new BorderLayout());
   container.add(speelveld, BorderLayout.CENTER);
}

Correct me plz if I'm wrong...

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 05-09 20:53
Dat kan, maar je hoeft niet per se een aparte Container aan te maken, je kan ook gewoon

getContentPane().setLayout(..);
getContentPane().add(spelbord);

doen.
Pagina: 1