Gå til innhold

Nytt vindu når en klikker på menyen


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 av ilpostino
Lenke til kommentar
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
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
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
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
  • 8 måneder senere...
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
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
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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...