JPanel adden op een JFrame in een andere class

Status
Niet open voor verdere reacties.

Kligham

Gebruiker
Lid geworden
7 jan 2009
Berichten
389
Hallo,

Zoals gezegd in titel. Er moet een JPanel geadd worden op mij JFrame die zich in een andere class bevindt, wanneer er iemand op een bepaal JMenuItem drukt. Alles moet kloppen behalve dat hij mijn variable frame niet herkent. Hoe kan ik dit oplossen?

Code:
package test;

import java.awt.event.InputEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

public class MenuGUI {

    private JMenuBar menuBar;

        /** Constructs the menu bar. */
    public MenuGUI() {

        menuBar = new JMenuBar();

        JMenu consultatie = new JMenu("Consultatie");
        menuBar.add(consultatie);
        JMenuItem nieuweClientItem= new JMenuItem("Nieuwe Cliënt");
        nieuweClientItem.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_DOWN_MASK));
        consultatie.add(nieuweClientItem);

        JMenu boekhouding = new JMenu("Boekhouding");
        menuBar.add(boekhouding);

        nieuweClientItem.addActionListener (
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {

                        NieuweClientGUI nieuweClientGUI = new NieuweClientGUI();

                        [COLOR="Red"]frame.[/COLOR]add(nieuweClientGUI.getPanel());

                    }
                }
        );

    }

        /** Returns the menu bar corresponding to this menu. */
    public JMenuBar getMenuBar() {return menuBar;}

}

Code:
package test;

import javax.swing.JFrame;

public class Main{

    private static void createAndShowGUI(){

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // construct a Menu object...
        MenuGUI menu = new MenuGUI();
            // ...and obtain its menu bar
        frame.setJMenuBar(menu.getMenuBar());

        frame.pack();
        frame.setSize(500,500);
        frame.setVisible(true);

    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
 
Laatst bewerkt:
Met een snelle blik op je code valt me al direct op dat jouw actionListener niet zegt dat je frame opnieuw getekent moet worden.

ff uitleg: Je frame wordt voor de eerste keer getekend als je hem "visible" zet, daarna voeg je je panel toe door op het menuItem te klikken, maar nu moet je je frame opnieuw tekenen (frame.repaint()) om je panel ook effectief te zien.
 
tweede blik leert mij ook dat de menubar je frame niet kent (die moet je dus meegeven in de constructor of via een setFrame() method)
 
Je moet dus inderdaad gewoon de constructor van MenuGui ombouwen.
Als volgt maak je een nieuw veld aan in de klasse MenuGui 'private JFrame frame' en zet je in je constructor dat hij het moet opslaan:

Code:
public MenuGUI(JFrame frame) {
this.frame = frame;

//rest van code
}

In de klasse Main komt het volgende:

Code:
//...
MenuGUI menu = new MenuGui(frame);
frame.setJMenuBar(menu.getMenuBar());
//...

+ nog een tip: Waarom maak je van de klasse MenuGUI geen extentie van de klasse JMenuBar? Bespaart je een methode getMenuBar() en veel verwarring.

Hopelijk heb je er wat aan.

Grts
 
Laatst bewerkt:
Met een snelle blik op je code valt me al direct op dat jouw actionListener niet zegt dat je frame opnieuw getekent moet worden.

ff uitleg: Je frame wordt voor de eerste keer getekend als je hem "visible" zet, daarna voeg je je panel toe door op het menuItem te klikken, maar nu moet je je frame opnieuw tekenen (frame.repaint()) om je panel ook effectief te zien.

Ik denk dat repaint() niet nodig is? Volgens mij kun je wel een panel adden zonder dat je moet repainten. Je moet misschien wel het panel.visible(true) zetten, maar of dat wel nodig is weet ik zelfs niet.

EDIT: Sorry, maar je hebt toch gelijk. Ik werk echter nooit met het achteraf nog toevoegen van dingen aan mijn Frame. Ik maak altijd een vast JPanel aan die op mijn frame als contentPane wordt ingesteld en dan verander ik daar vanalles in. Dan is de methode repaint() niet nodig. In dit geval wel. Mijn excuses.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan