BestillingGui.java [Last ned]

/*
 *  Skjema for registrering av bestillinger.
 *
 */
 
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
 
 
public class BestillingGui extends JFrame 
  implements ActionListener, WindowListener {
 
  // Datamodellen (objektsamlingen av Bestilling-objekt)
  // godtar vilkårlig mange bestillingslinjer pr. bestilling,
  // men i brukergrensesnittet er det satt en begrensning på
  // antall bestillingslinjer.
  private final int      MAX_LINJER = 5;
 
  private BrimiSamling   bestillinger;
 
  private JPanel         pnlKnapper;
  private JTextField     txtNr, txtDato, txtKunde;
  private JTextField[]   txtVareTab, txtAntallTab;
  private JButton        btnForrige, btnNeste, btnNy, btnSlett, btnOppdater;
 
 
  public BestillingGui(BrimiSamling bestillinger) {
    this.bestillinger = bestillinger;
    setTitle("Bestillinger");
    opprettGUI();
    pack();
    setLocationRelativeTo(null);
  }
 
 
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == btnForrige)
      bestillinger.forrige();
    else if (e.getSource() == btnNeste)
      bestillinger.neste(); 
    else if (e.getSource() == btnNy)
      bestillinger.ny();
    else if (e.getSource() == btnSlett)
      slett();
    else if (e.getSource() == btnOppdater)
      oppdater();
 
    vis();
  }
 
 
  public void windowClosing(WindowEvent e) {
    setVisible(false);
  }
 
 
  public void windowActivated(WindowEvent e)   {}
  public void windowDeactivated(WindowEvent e) {}
  public void windowDeiconified(WindowEvent e) {}
  public void windowIconified(WindowEvent e)   {}
  public void windowClosed(WindowEvent e)      {}
  public void windowOpened(WindowEvent e)      {}
 
 
  private void opprettGUI() {
    JPanel pnlSkjema = new JPanel();
 
    GridLayout gridLayout = new GridLayout(4+MAX_LINJER, 2, 5, 5);
    pnlSkjema.setLayout(gridLayout);
 
    txtNr     = new JTextField(15);
    txtDato   = new JTextField(15);
    txtKunde  = new JTextField(15);
 
    BrimiGui.leggTilFelt(pnlSkjema, "Bestillingsnr:", txtNr);
    BrimiGui.leggTilFelt(pnlSkjema, "Dato:", txtDato);
    BrimiGui.leggTilFelt(pnlSkjema, "Kundenr:", txtKunde);
 
    leggTilLinjer(pnlSkjema);
 
    pnlKnapper = new JPanel();
    FlowLayout flowLayout = new FlowLayout();
    flowLayout.setAlignment(FlowLayout.LEFT);
    pnlKnapper.setLayout(flowLayout);
 
    btnForrige = new JButton("Forrige");
    btnNeste = new JButton("Neste");
    btnNy = new JButton("Ny");
    btnOppdater = new JButton("Oppdater");
    btnSlett = new JButton("Slett");
    pnlKnapper.add(btnForrige);
    pnlKnapper.add(btnNeste);
    pnlKnapper.add(btnNy);
    pnlKnapper.add(btnOppdater);
    pnlKnapper.add(btnSlett);
 
    add(pnlSkjema, BorderLayout.CENTER);
    add(pnlKnapper, BorderLayout.SOUTH);
 
    btnForrige.addActionListener(this);
    btnNeste.addActionListener(this);
    btnNy.addActionListener(this);
    btnOppdater.addActionListener(this);
    btnSlett.addActionListener(this);
 
    txtNr.setEditable(false);
 
    vis();
  }  
 
 
  // Vis aktivt objekt på skjermen.
  private void vis() {
    Bestilling b = (Bestilling) bestillinger.denne();
    if (b != null) {
      txtNr.setText(Integer.toString(b.getNr()));
      txtDato.setText(b.getDato());
      txtKunde.setText(Integer.toString(b.getKnr()));
 
      ArrayList<BestillingsLinje> linjer = b.getLinjer();
      for (int i=0; i<MAX_LINJER; i++) {
        if (i < linjer.size()) {
          BestillingsLinje bl = linjer.get(i);
          txtVareTab[i].setText(Integer.toString(bl.getVnr()));
          txtAntallTab[i].setText(Integer.toString(bl.getAntall()));        
        }
        else {
          txtVareTab[i].setText("");
          txtAntallTab[i].setText("");        
        }
      }
    }
  }
 
 
  // Oppdater aktivt objekt fra tekstfeltene.
  private void oppdater() {
    Bestilling b = (Bestilling) bestillinger.denne();
    if (b != null) {
      b.setDato(txtDato.getText());
      b.setKnr(Integer.parseInt(txtKunde.getText()));
 
      ArrayList<BestillingsLinje> linjer = new ArrayList<BestillingsLinje>();
      for (int i=0; i<MAX_LINJER; i++) {
 
        try {
          int vnr = Integer.parseInt(txtVareTab[i].getText());
          int antall = Integer.parseInt(txtAntallTab[i].getText());
          BestillingsLinje bl = new BestillingsLinje(vnr, antall);
          linjer.add(bl);
        }
        catch (NumberFormatException e) {
          // Tomme tekstfelt gir unntak ved parseInt, og vi hopper bare over.
          // Burde sjekket og vist en passende feilmelding også når brukeren
          // skriver et ulovlig varenr og/eller ulovlig antall. Programmering
          // av slik inndatakontroll bør gjøres på samtlige tekstfelt, men er
          // overlatt leseren som en ekstraøving.
        }
      }
 
      b.setLinjer(linjer);
    }
  }
 
 
  // Slett aktivt objekt.
  private void slett() {
    int bnr = Integer.parseInt(txtNr.getText());
    if (!bestillinger.slett(bnr))
      Brimi.melding("Bestilling " + bnr + " finnes ikke!");
  }
 
 
  private void leggTilLinjer(JPanel panel) {
    JLabel lblVare = new JLabel("Varenr");
    JLabel lblAntall = new JLabel("Antall");
    panel.add(lblVare);
    panel.add(lblAntall);
 
    txtVareTab = new JTextField[MAX_LINJER];
    txtAntallTab = new JTextField[MAX_LINJER];
    for (int i=0; i<MAX_LINJER; i++) {
      txtVareTab[i] = new JTextField(15);
      txtAntallTab[i] = new JTextField(15);
      panel.add(txtVareTab[i]);
      panel.add(txtAntallTab[i]);
    }
  }
 
}
 
Kildekode blir vist ved hjelp av GeSHi.