© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Menuer
Vejledende løsninger

 

 

1 Da opgavens tre delløsninger er inkrementerende vil vi kun se den endelige løsning efter figur 1c.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MenuFrame extends JFrame implements ActionListener {
  
  private JMenuItem saveSettingsMI, loadSettingsMI, savePositionMI;
  
  public MenuFrame( String titel ) {
    super( titel );
    
    setJMenuBar( makeMenuBar() );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 300, 100 );
    setVisible( true );
  }
  
  private JMenuBar makeMenuBar() {
    JMenuBar bar = new JMenuBar();
    
    JMenu settingsMenu = new JMenu( "Settings" );
    settingsMenu.setMnemonic( 'E' );
  
      saveSettingsMI = new JMenuItem( "Save" );
      saveSettingsMI.setMnemonic( 'S' );
      saveSettingsMI.setAccelerator(
        KeyStroke.getKeyStroke( 'S', Event.CTRL_MASK ) );
      saveSettingsMI.addActionListener( this );
      settingsMenu.add( saveSettingsMI );
    
      loadSettingsMI = new JMenuItem( "Load" );
      loadSettingsMI.setMnemonic( 'L' );
      loadSettingsMI.setAccelerator(
        KeyStroke.getKeyStroke( 'L', Event.CTRL_MASK ) );
      loadSettingsMI.addActionListener( this );
      settingsMenu.add( loadSettingsMI );
    
      settingsMenu.addSeparator();

      savePositionMI = new JMenuItem( "Save position" );
      savePositionMI.setMnemonic( 'P' );
      savePositionMI.setAccelerator(
        KeyStroke.getKeyStroke( 'P', Event.CTRL_MASK ) );
      savePositionMI.addActionListener( this );
      settingsMenu.add( savePositionMI );
    
    bar.add( settingsMenu );
    
    return bar;
  }
  
  public void actionPerformed( ActionEvent e ) {
    Object source = e.getSource();
    
    if ( source == saveSettingsMI )
      System.out.println( "Save settings" );
    else if ( source == loadSettingsMI )
      System.out.println( "Load settings" );
    else if ( source == savePositionMI )
      System.out.println( "Save position" );
  }
}

 

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

public class MenuFrame extends JFrame implements ActionListener {
  
  private JMenuItem exitMI, newWindowMI, newPostMI, newMessageMI;
  private JMenu newMI;
  
  public MenuFrame( String titel ) {
    super( titel );
    
    setJMenuBar( makeMenuBar() );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 300, 100 );
    setVisible( true );
  }
  
  private JMenuBar makeMenuBar() {
    JMenuBar bar = new JMenuBar();
    
    JMenu fileMenu = new JMenu( "File" );
    fileMenu.setMnemonic( 'F' );
      
      newMI = new JMenu( "New" );
      newMI.setMnemonic( 'N' );
        
        newWindowMI = new JMenuItem( "Window" );
        newWindowMI.setMnemonic( 'W' );
        newWindowMI.setAccelerator(
          KeyStroke.getKeyStroke( 'W', Event.CTRL_MASK ) );
        newWindowMI.addActionListener( this );
        newMI.add( newWindowMI );
        
        newMI.addSeparator();
        
        newPostMI = new JMenuItem( "Post" );
        newPostMI.setMnemonic( 'P' );
        newPostMI.setAccelerator(
          KeyStroke.getKeyStroke( 'P', Event.CTRL_MASK ) );
        newPostMI.addActionListener( this );
        newMI.add( newPostMI );
        
        newMessageMI = new JMenuItem( "Message" );
        newMessageMI.setMnemonic( 'M' );
        newMessageMI.setAccelerator(
          KeyStroke.getKeyStroke( 'M', Event.CTRL_MASK ) );
        newMessageMI.addActionListener( this );
        newMI.add( newMessageMI );
        
      fileMenu.add( newMI );
      
      fileMenu.addSeparator();
    
      exitMI = new JMenuItem( "Exit" );
      exitMI.setMnemonic( 'X' );
      exitMI.setAccelerator(
        KeyStroke.getKeyStroke( 'X', Event.CTRL_MASK ) );
      exitMI.addActionListener( this );
      fileMenu.add( exitMI );
    
    bar.add( fileMenu );
    
    return bar;
  }
  
  public void actionPerformed( ActionEvent e ) {
    Object source = e.getSource();
    
    if ( source == exitMI )
      terminate();
    else if ( source == newWindowMI )
      System.out.println( "New Window" );
    else if ( source == newPostMI )
      System.out.println( "New Post" );
    else if ( source == newMessageMI )
      System.out.println( "New Message" );
  }
  
  private void terminate() {
    dispose();
    System.exit(0);
  }
}

Bemærk at selve termineringen placeres i en service-metode; hvilket fjerne de par linier kode-redundanse, som eller ville opstå.

 

3 Opgaven er en lettere useriøs leg med undermenuer. Da den er tællerstyret bruges en for-løkke og to referencer: En til den nuværende menu og en til den næste i række. Der afsluttes med et JMenuItem.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MenuFrame extends JFrame {
  
  public MenuFrame( String titel ) {
    super( titel );
    
    setJMenuBar( makeMenuBar() );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 300, 100 );
    setVisible( true );
  }
  
  private JMenuBar makeMenuBar() {
    JMenuBar bar = new JMenuBar();
    
    JMenu menu = new JMenu( "Base" );
    bar.add( menu );

    for ( int i=0; i<10; i++ ) {
      JMenu nextMenu = new JMenu( "" + i );
      menu.add( nextMenu );
      menu = nextMenu;
    }
    menu.add( new JMenuItem( "The End" ) );    
    
    return bar;
  }
}