Utilizarea marcajelor HTML în textele pentru componentele JFC/Swing

În mod obișnuit, textul introdus în componentele AWT sau JFC/Swing prin metoda void setText(String text) apare pe ecran pe suprafața componentei respective sub forma unui text scris pe o singura linie, folosind fontul SansSherif, culoarea neagra și o mărime implicită.

Începând cu platforma Java 2 (SDK 1.2) în textele introduse în componentele JFC/Swing (cum ar fi cele din clasele JButton, JLabel, JPanel etc.) pot fi folosite marcaje HTML. Dacă textul introdus prin metoda setText() începe cu marcajul <HTML>, el este interpretat ca un text HTML și tratat în mod corespunzător. Aceasta înseamnă că textul poate să apară pe suprafața componentei respective pe mai multe linii, să aibă diferite fonturi, culori și stiluri, conform cu marcajele HTML utilizate. Dacă, însă, sintaxa HTML nu este respectată, metoda generează o excepție.
 
Exemplu
În fișierul TextHTML.java este dat un exemplu de aplicație, în care se experimentează folosirea textelor HTML în componentele interfeței grafice. În fereastra aplicației sunt plasate următoarele componente:
  - o arie de text (JTextArea), în care se afișează un text inițial, care poate fi apoi modificat de utilizator;
  - o etichetă (JLabel) pe suprafața căreia se afișează textul existent în aria de text din partea stângă;
  - un buton cu inscripția Vizualizare text, a cărui acționare are ca efect afișarea pe suprafața etichetei a textului din aria de text;
  - un al doilea buton, cu inscripția Reset, a cărui acționare are ca efect revenirea la textul afișat inițial în aria de text.
Înscripțiile de pe cele două butoane au fost formatate folosind marcaje HTML.
În aria de text este introdus inițial un text HTML, care poate fi vizualizat apăsând pe butonul Vizualizare text. Acest text poate fi însă modificat în fereastra din stânga și vizualizat în eticheta din dreapta, apăsând pe același buton. Dacă se dorește, apoi, revenirea la textul inițial, se apasă butonul Reset.
Se pot experimenta, astfel, diferite modificări ale textului inițial sau se poate introduce oricând un text obișnuit sau un hipertext nou.
 
/* Experimentarea folosirii marcajelor HTML in textele pentru
   componente JFC/Swing
*/

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

class TextHTML extends JFrame {
 JTextArea ta;
 JLabel label;
 Sfarsit sfarsit;
 /* Textul introdus initial in aria de text */
 String textInitial="<html>\n<h2>Proba HTML</h2>Text normal<br>\n"+
  "<i>Text italic <b>Text italic aldin</b></i><br>\n"+
  " <font face=serif color=blue size=4>\n"+
  "  Text albastru cu font serif\n </font>\n<p bgcolor=aqua>"+
  "Revenire la text normal<br>cu fond aqua\n</html>";

 /* Constructorul clasei TextHTML construieste interfata grafica */
 TextHTML() {
  super("Incercare de texte HTML");
  Container cp=getContentPane();
  sfarsit=new Sfarsit(); // incheierea executarii aplicatiei
  addWindowListener(sfarsit);
  ta=new JTextArea(15,10); // aria in care se introduce textul HTML
  ta.setLineWrap(true);
  ta.setWrapStyleWord(true);
  ta.append(textInitial);
  ta.setBorder(BorderFactory.createTitledBorder(
    "Introduceti aici un text HTML"));
  Box vb=Box.createVerticalBox();
  Box hb=Box.createHorizontalBox();
  vb.add(ta);
  String textButon="<html><font color=red size=4>"+
   "<b><i>Vizualizare text</i></b></font>";
  JButton buton=new JButton(textButon); // butonul de comanda a 
                                        // vizualizarii textului

  buton.addActionListener(new Vizualizare());
  buton.setBorder(BorderFactory.createRaisedBevelBorder());
  hb.add(buton);
  JButton reset=new JButton("<html><font color=blue size=4>"+
   "<b>Reset</b></font>"); // butonul de revenire la textul initial
  reset.setBorder(BorderFactory.createRaisedBevelBorder());
  reset.addActionListener(new Reset());
  hb.add(reset);
  vb.add(hb);
  cp.add(vb,BorderLayout.WEST);
  label=new JLabel(); // eticheta pe care se vizualizeaza textul HTML
  label.setBorder(BorderFactory.createTitledBorder(
   "Vizualizarea textului HTML"));
  label.setOpaque(true);
  label.setBackground(Color.white);
  cp.add(label,BorderLayout.CENTER);
  setLocation(50,50);
  setSize(450,300);
  setVisible(true);
 }

 /* Clasa de ascultare a inchiderii ferestrei principale*/
 class Sfarsit extends WindowAdapter { 
  public void windowClosing(WindowEvent e) {
   System.exit(0);
  }
 }

 /* clasa de ascultare a butonului de vizualizare a textului */
 class Vizualizare implements ActionListener { 
  public void actionPerformed(ActionEvent e) {
   try {
    /* afisarea pe componenta label a textului extras din 
       aria de text ta
    */
    label.setText(ta.getText());
   }
   catch(Exception ex) { // s-a constatat o eroare in textul HTML
    label.setText("Eroare de sintaxa HTML");
   }
  }
 }

 /* Clasa de ascultare a butonului de Reset */
 class Reset implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    ta.setText(textInitial);
    label.setText("");
  }
 }

 public static void main(String args[]) {
  TextHTML text=new TextHTML(); // instantierea aplicatiei
 }
}

Remarcăm că, în această aplicație, s-au introdus următoarele abordări noi față de aplicațiile anterioare:
  - s-a considerat că interfața grafică este însăși clasa principala TextHTML, derivata din clasa JFrame. În consecință, adăugarea componentelor la fereastra principală se face în constructorul clasei TextHTML;
  - clasele interioare și câmpurile clasei TextHTML nu au mai fost declarate statice, în schimb, în metoda main() s-a creat o instanță a acestei clase.
Desigur că acest mod de construire a aplicației nu are legătura cu tema acesteia, fiind doar o ilustrare a unui alt mod de lucru posibil în Java.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați