Gå til innhold

Legge menuBar i egen klasse


Anbefalte innlegg

Nå har jeg dette i konstruktøren til hver eneste GUI-klasse som bruker denne menyen, altså veldig tungvindt, og mye repeterende kode. Hvordan kan jeg heller legge dette i en ekstern klasse (Meny.java, f.eks) og likevel få opp menyen i de GUI-klassene som bruker denne menyen? Hvis jeg skriver new = Meny(); i GUI-konstrutørene kommer ikke menyen fram. Noen tips?

// Menybaren
menuBar = new JMenuBar();
setJMenuBar(menuBar);
 
// Menyene
menuFil = new JMenu("Fil");
menuAlternativer = new JMenu("Alternativer");
menuHjelp = new JMenu("Hjelp");
menuBar.add(menuFil);
menuBar.add(menuAlternativer);
menuBar.add(menuHjelp);
 
// Meny-elementene
menuFilItem1 = new JMenuItem("Hovedmeny");
menuFilItem2 = new JMenuItem("Lukk");
menuAlternativerItem1 = new JMenuItem("blabla");
menuAlternativerItem2 = new JMenuItem("blabla");
menuAlternativerItem3 = new JMenuItem("blabla");
menuHjelpItem1 = new JMenuItem("Om dette programmet");
menuFil.add(menuFilItem1);
menuFil.add(menuFilItem2);
menuAlternativer.add(menuAlternativerItem1);
menuAlternativer.add(menuAlternativerItem2);
menuAlternativer.add(menuAlternativerItem3);
menuHjelp.add(menuHjelpItem1);

Lenke til kommentar
Videoannonse
Annonse

Hva med å lage en egen klasse som arver JMenuBar som lager den slik du vil ha den?

 

Noe ala dette

/*
* I dine konstruktører
**/
menuBar = new minMenuBar();
setJMenuBar(menuBar);

/*
* I egen klasse
**/

class minMenuBar extends JMenuBar {
   
   minMenuBar() {
       menuFil = new JMenu("Fil");
       menuAlternativer = new JMenu("Alternativer");
       menuHjelp = new JMenu("Hjelp");
       super.add(menuFil);
       super.add(menuAlternativer);
       super.add(menuHjelp);
       
       menuFilItem1 = new JMenuItem("Hovedmeny");
       menuFilItem2 = new JMenuItem("Lukk");
       menuAlternativerItem1 = new JMenuItem("blabla");
       menuAlternativerItem2 = new JMenuItem("blabla");
       menuAlternativerItem3 = new JMenuItem("blabla");
       menuHjelpItem1 = new JMenuItem("Om dette programmet");
       menuFil.add(menuFilItem1);
       menuFil.add(menuFilItem2);
       menuAlternativer.add(menuAlternativerItem1);
       menuAlternativer.add(menuAlternativerItem2);
       menuAlternativer.add(menuAlternativerItem3);
       menuHjelp.add(menuHjelpItem1);       
   }
}

 

Må nok bearbeides noe, da jeg ikke har hatt tid til å teste den eller sjekke ordentlig...

Lenke til kommentar

Tusen takk for den! Nå ser menyklassen min slik ut:

 

package prosjekt;

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

public class MinMenuBar extends JMenuBar {
private JMenu menuFil, menuAlternativer, menuHjelp;
private JMenuItem menuFilItem1, menuFilItem2, menuAlternativerItem1, menuAlternativerItem2, menuAlternativerItem3, menuHjelpItem1;

public MinMenuBar() {
 menuFil = new JMenu("Fil");
 menuAlternativer = new JMenu("Alternativer");
 menuHjelp = new JMenu("Hjelp");
 super.add(menuFil);
 super.add(menuAlternativer);
 super.add(menuHjelp);
 
 menuFilItem1 = new JMenuItem("Hovedmeny");
 menuFilItem2 = new JMenuItem("Lukk");
 menuAlternativerItem1 = new JMenuItem("blabla");
 menuAlternativerItem2 = new JMenuItem("blabla");
 menuAlternativerItem3 = new JMenuItem("blabla");
 menuHjelpItem1 = new JMenuItem("Om dette programmet");
 menuFil.add(menuFilItem1);
 menuFil.add(menuFilItem2);
 menuAlternativer.add(menuAlternativerItem1);
 menuAlternativer.add(menuAlternativerItem2);
 menuAlternativer.add(menuAlternativerItem3);
 menuHjelp.add(menuHjelpItem1);
 
 //Disable ting som ikke skal være med i del 1 og 2
 menuAlternativerItem2.setEnabled(false);
 menuAlternativerItem3.setEnabled(false);
 
 // Lytter til menyen
 Menylytter menylytter = new Menylytter();
 menuFilItem1.addActionListener(menylytter);
 menuFilItem2.addActionListener(menylytter);
 menuAlternativerItem1.addActionListener(menylytter);
 menuAlternativerItem2.addActionListener(menylytter);
 menuAlternativerItem3.addActionListener(menylytter);
 menuHjelpItem1.addActionListener(menylytter);
}
private class Menylytter implements ActionListener{
 public void actionPerformed(ActionEvent hendelse){
 	if(hendelse.getSource() == menuFilItem1){
   new Start();
   dispose();
 	}
 	else if(hendelse.getSource() == menuFilItem2){
   KundeKontroller.avslutt();
 	}
 	else if(hendelse.getSource() == menuAlternativerItem1){
   new MatrettGui();
   dispose();
 	}
 	else if(hendelse.getSource() == menuAlternativerItem2){
   //
 	}
 	else if(hendelse.getSource() == menuAlternativerItem3){
   //
 	}
 	else if(hendelse.getSource() == menuHjelpItem1){
   JOptionPane.showMessageDialog(null, "What's crackin'?");
 	}
 }
}
}

 

Men jeg får følgende feilmelding når jeg bruker dispose-metoden.

Noen som har peiling?

The method dispose() is undefined for the type MinMenuBar.Menylytter

Endret av remi sture
Lenke til kommentar

det er fordi dispose() er en jframe metode...

 

vet ikke helt hvorfor du vil kalle den i menyen, siden den påvirker hele ramma, men du kan sende med en referanse til jframe objektet som oppretter menybaren, og kalle metoden via det:

 

 public MinMenuBar(JFrame ramme) {
this.ramme = ramme;
}

...

ramme.dispose();

Lenke til kommentar

Er det bare "MinMenuBar du vil lukke eller er det hele programmet?

 

1. Dersom det er "MinMenuBar" kan du bruke metoden setVisible(boolean) som den arver fra JComponent, deretter sette alle referanser til "MinMenuBar" til "null".

Edit: Er selvføgelig lurt å fjerne den fra JFrame objektet den ligger, er ikke lett å huske alt.

 

2. Dersom det er hele programmet du vil lukke (fra "MinMenuBar") gjør du følgende: bruk metoden "getTopLevelAncestor" fra JComponent, denne vil da gi deg et "Container" objekt. Dette objektet er egentlig JFrame objektet du har brukt som hovedvindu. JFrame arver fra Container via Window klassen. Du kan nå bruke dispose metoden. (må caste til Window først).

 

Tror dette ble rett, er ikke lett å holde styr på så mange nivåer med arv.

Endret av mar
Lenke til kommentar
  • 2 måneder senere...

Slik du mener?

 

Container con = (Window) JComponent.getTopLevelAncestor();
con.dispose();

 

Da får jeg nemlig følgende feilmeldinger:

 

"Cannot make a static reference to the non-static method getTopLevelAncestor() from the type JComponent"

 

"The method dispose() is undefined for the type Container"
Endret av remi sture
Lenke til kommentar

Hva er en JComponent da?

 

Omtrent slik ser konstruktøren til en av gui-klassene mine ut, slik at dere skjønner omtrent hvordan den er bygget opp. Hvordan kan jeg da bruke den koden din til å dispose'e denne gui'en via en annen klasse? F.eks hvis jeg i en lytter i gui-klassen kaller på en metode kalt disposeGui() som ligger i en kontroller-klasse?

public Gui() {
 super("Brandbu Sushi Palace");
 guiflate = getContentPane();
 guiflate.setLayout(new BorderLayout());

 Nordpanel pnlNord = new Nordpanel();
 Sørpanel pnlSør	= new Sørpanel();
 Midtpanel pnlMidt = new Midtpanel();
 Vestpanel pnlVest = new Vestpanel();
 Østpanel pnlØst = new Østpanel();
 
 // Legge panelene inn på en BorderLayout
 guiflate.add(pnlNord, BorderLayout.NORTH);
 guiflate.add(pnlSør, BorderLayout.SOUTH);
 guiflate.add(pnlMidt, BorderLayout.CENTER);
 guiflate.add(pnlVest, BorderLayout.WEST);
 guiflate.add(pnlØst, BorderLayout.EAST);
 
 setVisible(true);
 pack();
 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}

 

public static void disposeGui() {
 Gui.dispose();
}

Endret av remi sture
Lenke til kommentar

copy/paste fra Java APIen, er et greit sted å begynne.

 

Class JComponent

 

java.lang.Object

  java.awt.Component

      java.awt.Container

          javax.swing.JComponent

 

All Implemented Interfaces:

ImageObserver, MenuContainer, Serializable

 

Direct Known Subclasses:

AbstractButton, BasicInternalFrameTitlePane, Box, Box.Filler, JColorChooser, JComboBox, JFileChooser, JInternalFrame, JInternalFrame.JDesktopIcon, JLabel, JLayeredPane, JList, JMenuBar, JOptionPane, JPanel, JPopupMenu, JProgressBar, JRootPane, JScrollBar, JScrollPane, JSeparator, JSlider, JSpinner, JSplitPane, JTabbedPane, JTable, JTableHeader, JTextComponent, JToolBar, JToolTip, JTree, JViewport

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...