Editor.java [Last ned]

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
 
 
/*
 *  Programmet er en enkel editor (videreføring av oppgave 8),
 *  med mulighet for lagring til fil, samt klipp-og-lim.
 *
 *  "Klipp-og-lim" ved hjelp av knappene/menyvalgene fungerer
 *  kun internt i programmet (som beskrevet i oppgaveteksten).
 *  CTRL-C, CTRL-X og CTRL-V fungerer på vanlig måte i skriveområdet,
 *  men dette bygger altså på standard funksjonalitet i JTextArea.
 *
 *  Merk: Menyer blir omtalt på side 346/347 i boken, men bruker 
 *  klasser fra AWT og ikke Swing. Alle forekomster av klassene 
 *  MenuBar, Menu og MenuItem bør altså erstattes av henholdsvis
 *  JMenuBar, JMenu og JMenuItem, og metoden setMenuBar bør erstattes
 *  av setJMenuBar. Dette er rettet opp i koden under.
 *
 */
public class Editor extends JFrame
  implements ActionListener, WindowListener {
 
  private JPanel     pnlKnapper;
  private JButton    btnKlippUt, btnKopier, btnLimInn;
  private JTextArea  txtEd;
  private JTextField txtStatus;
  private JMenuBar   menylinje;
  private JMenu      mnuFil, mnuRediger;
  private JMenuItem  mitNy, mitÅpne, mitLagre, mitAvslutt,
                     mitKlippUt, mitKopier, mitLimInn;
 
  // "Utklippstavle" ved bruk av Kopier og Klipp ut
  private String     utklipp = "";
 
 
  public static void main(String[] args) {
    Editor gui = new Editor();
    gui.setTitle("Editor");
    gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
    gui.setSize(600, 600);
    gui.setVisible(true);
  }
 
 
  public  Editor() {
 
    // Lag meny-objekter
    menylinje = new JMenuBar();
    mnuFil = new JMenu("Fil");
    mnuRediger = new JMenu("Rediger");
    mitNy = new JMenuItem("Ny");
    mitÅpne = new JMenuItem("Åpne");
    mitLagre = new JMenuItem("Lagre");
    mitAvslutt = new JMenuItem("Avslutt");
    mitKlippUt = new JMenuItem("Klipp ut");
    mitKopier = new JMenuItem("Kopier");
    mitLimInn = new JMenuItem("Lim inn");
 
    // Lag og konfigurer skriveområde
    txtEd = new JTextArea(80, 40);
    txtEd.setLineWrap(true);
    txtEd.setWrapStyleWord(true);
 
    // Lag øvrige GUI-objekter
    pnlKnapper = new JPanel();
    btnKlippUt = new JButton("Klipp ut");
    btnKopier = new JButton("Kopier");
    btnLimInn = new JButton("Lim inn");
    txtStatus = new JTextField(80);
 
    // Bygg menysystem
    mnuFil.add(mitNy);
    mnuFil.add(mitÅpne);
    mnuFil.add(mitLagre);
    mnuFil.add(mitLagre);
    mnuFil.addSeparator();
    mnuFil.add(mitAvslutt);
    mnuRediger.add(mitKlippUt);
    mnuRediger.add(mitKopier);
    mnuRediger.add(mitLimInn);
    menylinje.add(mnuFil);
    menylinje.add(mnuRediger);
    this.setJMenuBar(menylinje);
 
    // Sett layout
    this.setLayout(new BorderLayout());
    FlowLayout FL = new FlowLayout();
    FL.setAlignment(FlowLayout.LEFT);
    pnlKnapper.setLayout(FL);
 
    // Legg komponenter inn i paneler
    pnlKnapper.add(btnKlippUt);
    pnlKnapper.add(btnKopier);
    pnlKnapper.add(btnLimInn);
    this.add(pnlKnapper, BorderLayout.NORTH);
    this.add(txtEd, BorderLayout.CENTER);
    this.add(txtStatus, BorderLayout.SOUTH);
 
    // Lytt på relevante komponenter og menyvalg
    btnKlippUt.addActionListener(this);
    btnKopier.addActionListener(this);
    btnLimInn.addActionListener(this);
    mitNy.addActionListener(this);
    mitÅpne.addActionListener(this);
    mitLagre.addActionListener(this);
    mitAvslutt.addActionListener(this);
    mitKlippUt.addActionListener(this);
    mitKopier.addActionListener(this);
    mitLimInn.addActionListener(this);
    this.addWindowListener(this);
  }
 
 
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == btnKlippUt || e.getSource() == mitKlippUt) {
      utklipp = txtEd.getSelectedText();
      txtEd.replaceSelection("");
    }
    else if (e.getSource() == btnKopier || e.getSource() == mitKopier)
      utklipp = txtEd.getSelectedText();
    else if (e.getSource() == btnLimInn || e.getSource() == mitLimInn)
      txtEd.replaceSelection(utklipp);
    else if (e.getSource() == mitNy)
      txtEd.setText("");
    else if (e.getSource() == mitÅpne)
      åpneFil();
    else if (e.getSource() == mitLagre)
      lagreFil();
    else if (e.getSource() == mitAvslutt)
      avslutt();
  }
 
 
  public void windowClosing(WindowEvent e) {
    avslutt();
  }
 
 
  public void windowIconified(WindowEvent e)   {}
  public void windowOpened(WindowEvent e)      {}
  public void windowClosed(WindowEvent e)      {}
  public void windowDeiconified(WindowEvent e) {}
  public void windowActivated(WindowEvent e)   {}
  public void windowDeactivated(WindowEvent e) {}
 
 
  private void avslutt() {
    System.exit( 0 );
  }
 
 
  // Leser innholdet på en fil og viser det i skriveområdet
  private void åpneFil() {
    try {
      String filnavn = lesFilnavn(false);
      Scanner leser = new Scanner( new File(filnavn) );
      leser.useDelimiter("\\Z");
      String innhold = leser.next();
      txtEd.setText(innhold);
    }
    catch (IOException e) {
      txtStatus.setText("Klarte ikke å åpne filen.\n" + e.toString());
    }
  }
 
 
  // Lagrer innholdet i skriveområdet til fil
  private void lagreFil() {
    try {
      String filnavn = lesFilnavn(true);
      PrintWriter skriver = new PrintWriter(filnavn);
      skriver.print(txtEd.getText());
      skriver.close();
    }
    catch (IOException e) {
      txtStatus.setText("Klarte ikke å lagre til fil.\n" + e.toString());
    }
  }
 
 
  // Leser inn et filnavn fra brukeren vha JFileDialog.
  // Parameter lagre bestemmer om det skal vises en
  // "lagre-dialog" eller "åpne-dialog".
  private String lesFilnavn(boolean lagre) {
    String filnavn = null;
    JFileChooser filvelger = new JFileChooser();
    filvelger.setCurrentDirectory(new File("."));
    int status = 0;
    if (lagre)
      status = filvelger.showSaveDialog(null);
    else
      status = filvelger.showOpenDialog(null);
    if (status == JFileChooser.APPROVE_OPTION) {
      File fil = filvelger.getSelectedFile();
      filnavn = fil.getAbsolutePath();
    }
    return filnavn;
  }
 
}
 
Kildekode blir vist ved hjelp av GeSHi.