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

 

 

1 Panellet får et ikke ubetydeligt omgang, som den slags jo så ofte gør:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class CopyPasteProducerPanel extends JPanel implements ActionListener, KeyListener {
  private JTextField ord, antal;
  private JButton print;
  private JTextArea output;
  
  public CopyPasteProducerPanel() {
    
    ord = new JTextField( 10 );
    ord.addKeyListener( this );
    
    antal = new JTextField( 4 );
    antal.addKeyListener( this );
    
    print = new JButton( "Print" );
    print.setEnabled( false );
    print.addActionListener( this );
    
    output = new JTextArea( 10, 20 );
    output.setEditable( false );
    
    /*
     * Layout
     */
    
    setLayout( new BorderLayout() );
    add( new JScrollPane( output ) );
    
    JPanel topPanel = new JPanel();
    topPanel.setLayout( new FlowLayout() );
    topPanel.add( new JLabel( "Ord:" ) );
    topPanel.add( ord );
    topPanel.add( new JLabel( "Antal:" ) );
    topPanel.add( antal );
    topPanel.add( print );
    
    add( topPanel,  BorderLayout.NORTH );
  }
  
  public void actionPerformed( ActionEvent e ) {
    // Dette kan kun være Print-knappen
    
    int n = Integer.parseInt( antal.getText() );
    String tekst = ord.getText();
    
    output.setText( "" );
    for ( int i=0; i<n; i++ )
      output.append( tekst + '\n' );
  }
  
  public void keyReleased( KeyEvent e ) {
    print.setEnabled( printable() );
  }
  
  private boolean printable() {
    try {
      int n = Integer.parseInt( antal.getText() );
      if ( n <= 0 )
        return false;
      
      if ( ord.getText().length() == 0 )
        return false;
      
      return true;
    } catch ( NumberFormatException e ) {
      return false;
    }
  }
  
  /*
   * Nødvendige stubbe fordi vi er KeyListener
   */
  
  public void keyPressed( KeyEvent e ) {
  }
  
  public void keyTyped( KeyEvent e ) {
  }
}
Bemærk at vi ikke behøver at checke source på de event vi modtager, da deres type er tilstrækkelig for den skelnen vi behøver.
Beslutning om tekstfelterne indeholder korrekt oplysninger til at køre en print, er placeret i service-metoden printable.

 

Endelig har vi testanvendelsen, der placerer panellet i en frame:

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

public class Main {

  public static void main( String[] args ) {
    JFrame frame = new JFrame();
    frame.setTitle( "CopyPaste Maskine" );
    frame.getContentPane().setLayout( new BorderLayout() );
    frame.getContentPane().add( new CopyPasteProducerPanel() );
    frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible( true );
  }
}

Kildetekster:

CopyPasteProducerPanel.java
Main.java