torsdag 9 april 2009

JTextArea och JTextComponent - Java programmering

Klassen JTextField använde man för att ge användaren möjligheten att ge indata på en rad.
Vill man visa en längre text eller gee användaren möjlighet att redigarea mer än en rad kan man använda klassen JTextArea. Denna klass har många likheter med klassen JTextField (De har båda en gemensam superklass JTextComponent). Man kan t.ex. i båda klasserna från programmet avläsa den text användaren skrivit eller den del av texten som användaren markerat. 

(se länk för mer fakta)

När man skapar ett objekt av klassen JTextArea har man flera möjligheter.
 Vill man t.ex. skapa ett objekt av klassen JTextArea med r rader och k kolummer skriver man

      JTextArea a = new JTextArea (r , k);

Om man vill ha skjutreglage runt textarean skall man lägga JTextArean - objektet i ett JScrollPane  objekt:

       JScrollPane sp = new JScrollPane(a);

Användaren kan skriva text i arean och klippa och klistra på normalt sätt, men man kan också från programmet lägga in och ta bort text. Det går även att ange att bara programmet får ändra i textarean. Detta kan vara användarbart om man vill visa en text, t.ex. en hjälptext för användaren.

Antag t.ex. att vi har en String-variabel s och att man vill lägga till den text som finns i s sist i textarean. Då kan man göra anropet.

  a.append(s  +  "/n");    // lägg till s + radframmatning



Vi  skall nu visa ett ganska avancerat program!, en texteditor. Med hjälp de grafiska standarklasserna är det förvånansvärt enkelt att konstruera programmet. När man kör programmet får man upp ett fönster som liknar  något så här:

                                                                                                     
I textarean kan användaren redigera text på vanligt sätt. Vill man öppna och läsa in en befintlig textfil skriver man filens namn i textfältet längst upp till vänster och klickar sedan på knappen Öppna. Då suddas textareans tidigare innehåll ut och den nya filen läses in. Om man klickar på knappen Spara kommer programmet att spara det som visas i textarean i den angivna filen.

Fönstret har delats upp i två delar. Överst finns en panel med fem komponenter: en JLabel, ett JTextField-objekt och tre JButton knappar. Komponenterna på panelen placeras ut med GrindLayout (1 rad och fem kolumner). Under panelen finns ett JTextArea-objekt. Panelen och JTextArea-objektet placeras ut i fönstret med BorderLayout.  ( Vi behöver inte explict ange att borderlayout skall användas, eftersom BorderLayout är deafult för ett fönsters arbetsyta. ).  BorderLayout är ,  när man placerar ut komponenter så anger man i vilket väderstreck de skall placeras. Dessutom kan man ange platsen CENTER. Panelen med knapparna placeras på platsen NORTH. Textarean placeras på platsen CENTER, vilket innebär att den kommer att få allt extra utrymmer om fönstret förstoras. Programmets har utseendet:

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

public class TextEdit extends JFrame implements ActionListener {

JPanel p = new JPanel();
JTextField namn = new JTextField();
JButton öppna = new JButton("Öppna");
JButton spara = new JButton("Spara");
JButton sluta = new JButton("Avsluta");
JTextArea area = new JTextArea(10, 60);
JScrollPane sp = new JScrollPane(area,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

public TextEdit() {
area.setFont(new Font("Monospaced", Font.PLAIN, 12));
// placera ut komponeterna på panelen p
p.setLayout(new GridLayout(1, 5));
p.add(new JLabel("Filnamn: ", JLabel.RIGHT));
p.add(namn);
p.add(öppna);
p.add(spara);
p.add(sluta);
namn.addActionListener(this);
öppna.addActionListener(this);
spara.addActionListener(this);
sluta.addActionListener(this);

// placera ut panelen och textarean
add(p, BorderLayout.NORTH);
add(sp, BorderLayout.CENTER);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e) {
// undersöker vilken knapp användaren har tryckt på
if (e.getSource() == namn || e.getSource() == öppna)
läsInFil(namn.getText());
else if (e.getSource() == spara)
sparaFil(namn.getText());
else if (e.getSource() == sluta)
System.exit(0);
}

private void läsInFil(String filnamn) {
try {
FileReader r = new FileReader(filnamn);
area.read(r, null);
} catch (IOException e) {
}
}

private void sparaFil(String filnamn) {
try {
FileWriter w = new FileWriter(filnamn);
area.write(w);
} catch (IOException e) {
}
}

public static void main(String[] args) {
TextEdit t = new TextEdit();
}

}

Inga kommentarer:

Skicka en kommentar