© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Tekstfelter

 

 

  Vi skal i dette kapitel se på en række klasser, som gør det muligt at lave tekstfelter - dvs. grafiske komponenter de arbejder med simpel tekst.
  Klasserne er vist i følgende klasse-hierarki; hvor de klasse vi ikke gennemgår er markeret med gråt:
Figur 1:
Klasse-hierarkiet for klasserne i dette kapitel
  JTextField og JPasswordField arbejder med en enkelt linie tekst, mens JTextArea kan arbejde med flere linier.
  Tekstfelterne understøtter copy/cut/paste i forhold til clipboard, og det er derfor muligt at kopiere tekst frem og tilbage mellem andre programmer og tekstfelter i et Java-program.
  Vedrørende event-håndtering, melder man sig som ActionListener, og håndterer ActionEvent's på sædvanlig vis. Dette gør sig gældende for alle tre klasser, og vi vil ikke i dette kapitel studere event-håndteringen.
 

 

1. JTextField

  JTextField er et tekstfelt der kun tillader en linie tekst. Som alle de andre tekstfelter tillader den at brugeren retter i teksten, og dens primære formål er at modtage input fra denne.
  Betragt følgende vindue:
Figur 2:
JTextField med otte kolonner
  Der er lavet med følgende frame:
Source 1:
JTextField med otte kolonner
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TextFelterFrame extends JFrame {
  
  public TextFelterFrame( String title ) {
    super( title );
    
    getContentPane().setLayout( new FlowLayout() );
    
    JTextField tekstFelt = new JTextField( 8 );
    getContentPane().add( tekstFelt );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 200, 100 );
    setVisible( true );
  }
}
  Vi har her lavet et JTextField med otte kolonner. Det er gjort med en af følgende konstruktorer:
JTextField()
JTextField( int columns )
JTextField( String text )
JTextField( String text, int columns )
  Antallet af kolonner (eng: columns) man angiver som parameter ganges med den maksimale bredde for tegn i den aktuelle font. Det giver normalt en betydelig større bredde end man skulle forvente, idet der kan stå langt mere end otte tegn.
  De andre konstruktorer gør det muligt at sætte en initiel tekst:
Figur 3:
JTextField med otte kolonner og initiel tekst
  Brugeren kan vælge at arbejde videre med denne tekst, rette i den eller slette den.
  Nok er JTextFields primære anvendelse at modtage input fra brugeren, men den kan også bruges til at vise en tekst. I så fald skal man forhindre brugeren i at rette i tekstfeltet, hvilket gøres med metoden:
void setEditable( boolean b )
  Metoden er nedarvet fra JTextComponent, og kalder man den med false bliver feltets baggrund gråt, og brugeren kan ikke ændre i indholdet:
Figur 4:
JTextField der ikke er editerbart
  Man kan anvende denne mulighed til dynamisk at gøre det betinget, af visse omstændigheder, om teksten kan ændres.
  Det er også muligt at ændre om teksten er venstre-, højre-stillet eller centreret.
  Det gøres med metoden:
void setHorizontalAlignment( int alignment )
  Parameteren skal være en af følgende tre konstanter:
JTextField.LEFT
JTextField.CENTER
JTextField.RIGHT
  I den følgende figur har vi valgt at bruge CENTER.
Figur 5:
Alignment sat til CENTER
  Øverst har vi vinduet med den initielle tekst, og nederst har vi slettet teksten for at skrive en anden.
  Man ser at tekstområdet hele tiden centreres, og ved det tomme tekstfelt bliver cursoren placeret i midten.
 

 

2. JPasswordField

  JPaswordField er, som det ses af figur 1, en subklasse til JTextField. Den føjer kun én ny egenskab til tekstfeltet, nemlig at man ikke kan se hvad man skriver.
  Følgende er et eksempel på et JPasswordField hvor jeg har indtastet administrator-password'et til min PC:
Figur 6:
JPassword-Field med otte kolonner
  Man henter det password brugeren indtaster med metoden:
String getPassword()
 

 

Konstruktorerne er nøjagtig de samme som JTextField's.

  Den eneste variationsmulighed, som findes i JPasswordField er hvilket tegn, der skal bruges som erstatning for de tegn brugeren indtaster. Default er '*', men man kan selv vælge et tegn med metoden:
void setEchoChar( char c )
  F.eks. kan vi ændre det til '?':
Figur 7:
JPassword-Field med anden echochar
  med følgende frame:
Source 2:
JTextField med anden echochar
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TextFelterFrame extends JFrame {
  
  public TextFelterFrame( String title ) {
    super( "setEchoChar( '?' )" );
    
    getContentPane().setLayout( new FlowLayout() );
    
    JPasswordField pwd = new JPasswordField( 8 );
    pwd.setEchoChar( '?' );
    getContentPane().add( pwd );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 200, 100 );
    setVisible( true );
  }
}
 

 

3. JTextArea

  JTextArea giver mulighed for at arbejde med flere linier, dvs. med mere dokument-orienterede tekster.
  Betragt følgende vindue:
Figur 8:
JTextArea med otte kolonner og fire linier
  Der er lavet med følgende frame:
Source 3:
JTextArea med otte kolonner og fire linier
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TextFelterFrame extends JFrame {
  
  public TextFelterFrame( String title ) {
    super( "JTextArea( 5, 8 )" );
    
    getContentPane().setLayout( new FlowLayout() );
    
    JTextArea area = new JTextArea( 5, 8 );
    getContentPane().add( area );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 200, 150 );
    setVisible( true );
  }
}
  I figuren har vi været i gang med at skrive tekst i tekstfeltet, og som man ser er der plads til fem linier (første parameter til konstruktoren) og de otte kolonner (anden parameter), der svarer til otte gange den maksimale bredde for tegn i den aktuelle font.
 

 

Man kan indstille en række egenskaber ved JTextArea. F.eks. kan man angive hvor mange mellemrum tabulering skal betyde med metoden:

void setTabSize( int size )
  F.eks.:
Figur 9:
JTextArea med tabulering sat til tre
  Hvor der er lavet en række tabuleringer. Default for tabulering er 8.
 

 

Hvis man fortsætter med at skrive på en linie, vil man fortsætte ud af den synlige del af tekstfeltet og den tekst man skriver vil ikke kunne ses. Med følgende to metoder kan man indstille JTextArea så den foretager automatiske linieskift for at undgå dette.

void setLineWrap( boolean wrap )
void setWrapStyleWord( boolean word )
  Hvis man kalder setLineWrap med true, vil der blive indsat linieskift når der ikke er plads til flere tegn på en linie. Hvis man kalder setWrapStyleWord med true vil disse linieskift ske mellem ord, dvs. ved mellemrum.
  F.eks.:
Figur 10:
JTextArea med wrap mellem ord
  Der laves med følgende frame:
Source 4:
JTextArea med wrap mellem ord
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class TextFelterFrame extends JFrame {
  
  public TextFelterFrame( String title ) {
    super( "setWrapStyleWord( true )" );
    
    getContentPane().setLayout( new FlowLayout() );
    
    JTextArea area = new JTextArea( 5, 8 );
    area.setLineWrap( true );
    area.setWrapStyleWord( true );
    getContentPane().add( area );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 200, 150 );
    setVisible( true );
  }
}