ilpostino Skrevet 5. april 2005 Del Skrevet 5. april 2005 Jeg har tatt opp igjen Java og står fast på en liten ting: holder på å lage GUI til et program. I dette GUI'et har jeg laget en meny med tilhørende ActionListener til hvert meny-valg. når noen klikker på Hjelp -> Om skal det sprette opp et nytt vindu som forteller om programmet. foreløbig har jeg kun fått til dette ved hjelp av internat frames, men jeg vil ha det til at selve "hovedvinduet" byttes ut når en klikker på noe ved menyen. (planen er at metoden ActionPerformed skal åpne de nye vinduene/panelene, men er litt usikker på hvordan jeg skal få de nye panelene til å "ta over" andre panel...) Lenke til kommentar
Patton Skrevet 6. april 2005 Del Skrevet 6. april 2005 Du trenger CardLayout. Naar du adderer paneler til et panel (eller container) om har CardLayout, saa blir panelene "stablet", og den oeverste vises. Panelet som skal vises kan du bestemme selv, f.eks. med actionListener (som du har beskrevet). Eks: frame.getContentPane().setLayout(new CardLayout()); frame.getContentPane().add(mainPanel, "main"); // "main" er noekkelen frame.getContentPane().add(helpPanel, "help"); // "help" er noekkelen .... ActionListener actionShowHelp = new ActionListener() { public void actionPerformed(ActionEvent aE) { CardLayout lLayout = (CardLayout) frame.getContentPane().getLayout(); lLayout.show(frame.getContentPane(),"help"); }}; Koden er veldig simplifisiert (og kanskje ukompilerbar), men haaper du faarstaar ideen. Lenke til kommentar
ilpostino Skrevet 10. april 2005 Forfatter Del Skrevet 10. april 2005 (endret) nå har jeg fiklet til noe greier her, men jeg står litt fast. har fått til CardLayout bytte mellom disse. (tror jeg trenger en større forståelse for dette, men den kommer med treningen regner jeg med). det jeg ikke får til nå er å legge menyen til i vinduet. (det jeg har fått til nå er ved hjelp av en combo-box). hadde egentlig planer om å legge ved koden som en egen fil, men det går ikke av en eller annen grunn, så må nok dumpe alt her... spørsmålet er da; hvordan få lagt til menyen? //Dette importerer pakker til menysystemet import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; //Dette importerer pakkene til tastetrykkene import javax.swing.KeyStroke; import java.awt.Event.*; //Disse tar seg av diverse actionevents import java.awt.event.ActionListener; import java.awt.event.ActionEvent; //Dette importerer pakker til å vise popups import java.awt.Frame.*; import java.awt.*; import java.awt.event.*; //Dette importeres for å bruke CardLayout med awt.* og awt.event import javax.swing.*; import javax.swing.JPanel.*; public class DvdSamling extends JFrame implements ItemListener, ActionListener{ //JDesktopPane desktop; JPanel cards; final static String BUTTONPANEL = "JPanel with JButtons"; final static String TEXTPANEL = "JPanel with JTextField"; public JMenuBar menuBar() { //Dette legger til Meny-systemet JMenuBar menuBar; JMenu menu, submenu; JMenuItem openItem, lagreItem, closeItem, helpItem, aboutItem; JRadioButtonMenuItem rbMenuItem; JCheckBoxMenuItem cbMenuItem; //Lager menyen menuBar = new JMenuBar(); //Dette bygger den første menyen JMenu fileMenu = new JMenu("Fil"); menuBar.add(fileMenu); //Lager den første gruppen på menyen openItem = new JMenuItem("Åpne"); openItem.addActionListener(this); fileMenu.add(openItem); lagreItem = new JMenuItem("Lagre"); lagreItem.addActionListener(this); lagreItem = fileMenu.add(lagreItem); fileMenu.addSeparator(); // Add separator closeItem = new JMenuItem("Avslutt"); closeItem.addActionListener(this); closeItem = fileMenu.add(closeItem); //Dette bygger den andre knappen på menyen JMenu hjelpMenu = new JMenu("Hjelp"); menuBar.add(hjelpMenu); helpItem = new JMenuItem("Hjelp"); helpItem = hjelpMenu.add(helpItem); // Add Close item helpItem.addActionListener(this); // Legger til ActionListener aboutItem = new JMenuItem("Om"); aboutItem = hjelpMenu.add(aboutItem); // Add Close item aboutItem.addActionListener(this); // Legger til ActionListener return menuBar; } public void addComponentToPane(Container pane) { //Lager panelene som brukes i programmet. JPanel comboBoxPane = new JPanel(); //use FlowLayout String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL }; JComboBox cb = new JComboBox(comboBoxItems); cb.setEditable(false); cb.addItemListener(this); comboBoxPane.add(cb); //Create the "cards". JPanel card1 = new JPanel(); card1.add(new JButton("Button 1")); card1.add(new JButton("Button 2")); card1.add(new JButton("Button 3")); JPanel card2 = new JPanel(); card2.add(new JTextField("TextField", 20)); //Create the panel that contains the "cards". cards = new JPanel(new CardLayout()); cards.add(card1, BUTTONPANEL); cards.add(card2, TEXTPANEL); pane.add(comboBoxPane, BorderLayout.PAGE_START); pane.add(cards, BorderLayout.CENTER); } //Dette lager GUI'et til programmet private void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); //Dette finner størelsen på skjermen Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int høyde = screenSize.height; int bredde = screenSize.width; //Lager vinduet og setter størelsen på denne JFrame frame = new JFrame("DVD Samling 0.1"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(0, 0, bredde, høyde); frame.setJMenuBar(menuBar()); //Dette lager contentpane DvdSamling demo = new DvdSamling(); demo.addComponentToPane(frame.getContentPane()); //Viser vinduet frame.setVisible(true); } public void itemStateChanged(ItemEvent evt) { CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, (String)evt.getItem()); } //Dette tar seg av events i programmet når knappene blir trykket public void actionPerformed(ActionEvent event) { String s = event.getActionCommand(); if (s.equals("Åpne")) { //createFrame(); } else if (s.equals("Hjelp")) { //createFrame(); } else if (s.equals("Om")) { //createFrame(); } else if (s.equals("Avslutt")) { System.exit(0); } } //Her er hovedmetoden public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new DvdSamling().createAndShowGUI(); } }); } } edit: endret til komplett kode... Endret 13. desember 2005 av ilpostino Lenke til kommentar
Patton Skrevet 11. april 2005 Del Skrevet 11. april 2005 frame.setJMenuBar(menuBar()); Lenke til kommentar
atsjoo Skrevet 11. april 2005 Del Skrevet 11. april 2005 (endret) Du kan også lage en JDialog, så lager du et objekt av denne og kjører setVisible(true) i lytteren til knappen, eventuelt rett og slett bruke JOptionPane.showMessageDialog Endret 11. april 2005 av atsjoo Lenke til kommentar
ilpostino Skrevet 12. april 2005 Forfatter Del Skrevet 12. april 2005 frame.setJMenuBar(menuBar()); jeg fikk dette kun til å fungere da jeg gorde funksjonen menuBar static og da fungerte ikke ActionListener lenger. forslag til hvordan jeg skal få omgått dette? (lett på java.sun.com og google uten å finne noe ut av dette) Lenke til kommentar
Patton Skrevet 13. april 2005 Del Skrevet 13. april 2005 frame.setJMenuBar(menuBar()); jeg fikk dette kun til å fungere da jeg gorde funksjonen menuBar static og da fungerte ikke ActionListener lenger. forslag til hvordan jeg skal få omgått dette? (lett på java.sun.com og google uten å finne noe ut av dette) Jeg kikket ikke godt nok paa koden din. Dette maa du endre : public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } til public static void main(String[] args) { new DVDSamling(); } // Konstruktor public DVDSamling() { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } +fjern alle static deklarasjoner fra metodene (static boer brukes sparsomt). Grunnen til at det ikke fungerer er at main metoden er statisk og kan bare kalle andre statiske metoder i sin egen klasse. Dessuten boer du ogsaa deklarere frame som en instans variabel, slik at du bare har en frame oppe (bruk heller frame.setVisible(false) hvis du vil gjemme vinduet). Lenke til kommentar
buskmann Skrevet 13. april 2005 Del Skrevet 13. april 2005 public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } Mindre komplisert løsning: public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new DVDSamling().createAndShowGUI(); } }); } Lenke til kommentar
ilpostino Skrevet 13. april 2005 Forfatter Del Skrevet 13. april 2005 Mindre komplisert løsning: public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new DVDSamling().createAndShowGUI(); } }); } den løsningen fungerte bedre. Da jeg prøvde løsningen til Patton hang maskinen seg av en eller annen grunn. takk for tips fra alle som har hjulpet meg så langt. jeg hadde slitt ganske mye mer hadde det ikke vært for deres hjelp. Lenke til kommentar
ilpostino Skrevet 13. desember 2005 Forfatter Del Skrevet 13. desember 2005 Dessuten boer du ogsaa deklarere frame som en instans variabel, slik at du bare har en frame oppe (bruk heller frame.setVisible(false) hvis du vil gjemme vinduet). 3995885[/snapback] tenkte det var på tide å bumpe denne tråden da jeg har satt igang med dette lille prosjektet mitt igjen. hvordan gjøres dette? når jeg nå trykker på menyen, hvordan får jeg vist de nye framsene som skal vises? (over har jeg rettet programkoden til slik den fremstår per idag) Lenke til kommentar
Patton Skrevet 15. desember 2005 Del Skrevet 15. desember 2005 Dessuten boer du ogsaa deklarere frame som en instans variabel, slik at du bare har en frame oppe (bruk heller frame.setVisible(false) hvis du vil gjemme vinduet). 3995885[/snapback] tenkte det var på tide å bumpe denne tråden da jeg har satt igang med dette lille prosjektet mitt igjen. hvordan gjøres dette? når jeg nå trykker på menyen, hvordan får jeg vist de nye framsene som skal vises? (over har jeg rettet programkoden til slik den fremstår per idag) 5291261[/snapback] Jeg tok meg den frihet og modifiserte koden littegrann, slik at den er litt mer "ryddig". Jeg har ogsaa implementert noen forslag til hvordan disse vinduene kan vises. Jeg har hatt litt erfaring med Gui-utvikling og har funnet ut at lazy-initialization er en ypperlig maate aa organisere og programmere gui paa. Lazy initialize er naar jeg vil aksessere en komponent saa kaller jeg dens get metode. Hvis komponenten = null, blir den initialisert. Har den fordelen at den hierarkiske Gui-konstruksjonen blir med en gang mer oversiktlig. Dessuten maa man ikke passe paa hvor man skal initialisere en komponent, det gjoer man enkelt og greit i get-metoden. Den samme get-metoden kan addere andre komponenter ved aa kalle opp deres get-metoder. Paa denne maaten er det ogsaa litt enklere aa "ommoeblere" komponentene hvis det er oenskelig. /* // Dette importerer pakker til menysystemet import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; // Dette importerer pakkene til tastetrykkene import javax.swing.KeyStroke; import java.awt.Event.*; // Disse tar seg av diverse actionevents import java.awt.event.ActionListener; import java.awt.event.ActionEvent; // Dette importerer pakker til å vise popups import java.awt.Frame.*; import java.awt.*; import java.awt.event.*; import java.io.File; // Dette importeres for å bruke CardLayout med awt.* og awt.event import javax.swing.*; import javax.swing.JPanel.*; public class DvdSamling extends JFrame implements ItemListener, ActionListener { // JDesktopPane desktop; JPanel cards; private JFileChooser jFileChooser_Open; private JDialog jDialog_Help; private JDialog jDialog_About; private JButton jButton_CloseHelp; final static String BUTTONPANEL = "JPanel with JButtons"; final static String TEXTPANEL = "JPanel with JTextField"; public JMenuBar menuBar() { // Dette legger til Meny-systemet JMenuBar menuBar; JMenu menu, submenu; JMenuItem openItem, lagreItem, closeItem, helpItem, aboutItem; JRadioButtonMenuItem rbMenuItem; JCheckBoxMenuItem cbMenuItem; // Lager menyen menuBar = new JMenuBar(); // Dette bygger den første menyen JMenu fileMenu = new JMenu("Fil"); menuBar.add(fileMenu); // Lager den første gruppen på menyen openItem = new JMenuItem("Åpne"); openItem.addActionListener(this); fileMenu.add(openItem); lagreItem = new JMenuItem("Lagre"); lagreItem.addActionListener(this); lagreItem = fileMenu.add(lagreItem); fileMenu.addSeparator(); // Add separator closeItem = new JMenuItem("Avslutt"); closeItem.addActionListener(this); closeItem = fileMenu.add(closeItem); // Dette bygger den andre knappen på menyen JMenu hjelpMenu = new JMenu("Hjelp"); menuBar.add(hjelpMenu); helpItem = new JMenuItem("Hjelp"); helpItem = hjelpMenu.add(helpItem); // Add Close item helpItem.addActionListener(this); // Legger til ActionListener aboutItem = new JMenuItem("Om"); aboutItem = hjelpMenu.add(aboutItem); // Add Close item aboutItem.addActionListener(this); // Legger til ActionListener return menuBar; } public void addComponentToPane(Container pane) { // Lager panelene som brukes i programmet. JPanel comboBoxPane = new JPanel(); // use FlowLayout String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL }; JComboBox cb = new JComboBox(comboBoxItems); cb.setEditable(false); cb.addItemListener(this); comboBoxPane.add(cb); // Create the "cards". JPanel card1 = new JPanel(); card1.add(new JButton("Button 1")); card1.add(new JButton("Button 2")); card1.add(new JButton("Button 3")); JPanel card2 = new JPanel(); card2.add(new JTextField("TextField", 20)); // Create the panel that contains the "cards". cards = new JPanel(new CardLayout()); cards.add(card1, BUTTONPANEL); cards.add(card2, TEXTPANEL); pane.add(comboBoxPane, BorderLayout.PAGE_START); pane.add(cards, BorderLayout.CENTER); } // Dette lager GUI'et til programmet private void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); // Dette finner størelsen på skjermen Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int høyde = screenSize.height; int bredde = screenSize.width; // Lager vinduet og setter størelsen på denne setTitle("DVD Samling 0.1"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(0, 0, bredde, høyde); setJMenuBar(menuBar()); // Dette lager contentpane addComponentToPane(getContentPane()); // Viser vinduet setVisible(true); } public void itemStateChanged(ItemEvent evt) { CardLayout cl = (CardLayout) (cards.getLayout()); cl.show(cards, (String) evt.getItem()); } // Dette tar seg av events i programmet når knappene blir trykket public void actionPerformed(ActionEvent event) { String s = event.getActionCommand(); if (s.equals("Åpne")) { open(); } else if (s.equals("Hjelp")) { getJDialog_Help().setVisible(true); } else if (s.equals("Om")) { getJDialog_About().setVisible(true); } else if (s.equals("Avslutt")) { System.exit(0); } } private JDialog getJDialog_About() { if (jDialog_About == null) { jDialog_About = new JDialog(this,"Om",true); // Setup dialog in this method } return jDialog_About; } private JDialog getJDialog_Help() { if (jDialog_Help == null) { jDialog_Help = new JDialog(this,"Hjelp"); jDialog_Help.getContentPane().add(getJButton_CloseHelp()); jDialog_Help.pack(); // Setup help dialog in this method } return jDialog_Help; } private JButton getJButton_CloseHelp() { if (jButton_CloseHelp == null) { jButton_CloseHelp = new JButton("Lukk"); jButton_CloseHelp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent aE) { getJDialog_Help().setVisible(false); }}); } return jButton_CloseHelp; } private void open() { int returnVal = getJFileChooser_Open().showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File chosenFile = getJFileChooser_Open().getSelectedFile(); // do stuff } } private JFileChooser getJFileChooser_Open() { if (jFileChooser_Open == null) { jFileChooser_Open = new JFileChooser(); } return jFileChooser_Open; } // Her er hovedmetoden public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new DvdSamling().createAndShowGUI(); } }); } } Lenke til kommentar
ilpostino Skrevet 16. desember 2005 Forfatter Del Skrevet 16. desember 2005 Jeg tok meg den frihet og modifiserte koden littegrann, slik at den er litt mer "ryddig". Jeg har ogsaa implementert noen forslag til hvordan disse vinduene kan vises. Jeg har hatt litt erfaring med Gui-utvikling og har funnet ut at lazy-initialization er en ypperlig maate aa organisere og programmere gui paa. Lazy initialize er naar jeg vil aksessere en komponent saa kaller jeg dens get metode. Hvis komponenten = null, blir den initialisert. Har den fordelen at den hierarkiske Gui-konstruksjonen blir med en gang mer oversiktlig. Dessuten maa man ikke passe paa hvor man skal initialisere en komponent, det gjoer man enkelt og greit i get-metoden. Den samme get-metoden kan addere andre komponenter ved aa kalle opp deres get-metoder. Paa denne maaten er det ogsaa litt enklere aa "ommoeblere" komponentene hvis det er oenskelig. takk for at du tok deg tid til dette. etter å ha lest igjennom koden du har lagt ut lhar jeg fått mye mer innsikt i hvordan dette fungerer. men et lite spørsmål - hva kreves for at de nye vinduene kommer opp i samme vindu/overlapper hovedvinduet...? Lenke til kommentar
Mr.Garibaldi Skrevet 17. desember 2005 Del Skrevet 17. desember 2005 (endret) Hent ut hvor vinduet er nå ved hjelp av getLocation() eller getLocationOnScreen(), og bruk verdiene i setLocation(int, int)... Enjoy [EDIT] Endret siste URL, siden BB kode ikke liker ',' i URLer. Så bare bla ned forbi location, og så får du opp riktig metode... [/EDIT] Endret 17. desember 2005 av Mr.Garibaldi 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å