remi sture Skrevet 9. november 2005 Del Skrevet 9. november 2005 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
Mr.Garibaldi Skrevet 9. november 2005 Del Skrevet 9. november 2005 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
remi sture Skrevet 9. november 2005 Forfatter Del Skrevet 9. november 2005 (endret) 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 9. november 2005 av remi sture Lenke til kommentar
mikaelandre Skrevet 9. november 2005 Del Skrevet 9. november 2005 menylytterklassen din har ingen metode som heter dispose().... enten må du lage den, eller så prøver du å kalle en metode som ligger i en annen klasse, og du må da ha med et objekt fra den klassen Lenke til kommentar
remi sture Skrevet 9. november 2005 Forfatter Del Skrevet 9. november 2005 Det funker når klassen MinMenuBar extends JFrame, men nå må den jo extende JMenuBar. Hvordan kan jeg løse det da? Lenke til kommentar
mikaelandre Skrevet 9. november 2005 Del Skrevet 9. november 2005 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
mar Skrevet 10. november 2005 Del Skrevet 10. november 2005 (endret) 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 10. november 2005 av mar Lenke til kommentar
remi sture Skrevet 19. januar 2006 Forfatter Del Skrevet 19. januar 2006 (endret) 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 19. januar 2006 av remi sture Lenke til kommentar
mar Skrevet 19. januar 2006 Del Skrevet 19. januar 2006 Du må kalle getTopLevelAncestor() fra et JComponent objekt, ikke fra selve klassen (det er det du gjør nå). "Window win = (Window) componentObject.getTopLevelAncestor();" Lenke til kommentar
remi sture Skrevet 19. januar 2006 Forfatter Del Skrevet 19. januar 2006 (endret) 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 19. januar 2006 av remi sture Lenke til kommentar
mar Skrevet 19. januar 2006 Del Skrevet 19. januar 2006 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
remi sture Skrevet 20. januar 2006 Forfatter Del Skrevet 20. januar 2006 Hvis jeg f.eks bruker JPanel då, hvordan får jeg oppdatert hele gui'en når jeg har 5 forskjellige JPanels i gui'en? Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå