În cazul programelor pe care le-am făcut până acum, toate mesajele și răspunsurile apăreau ca linii de text sugestive, ecranul fiind folosit în mod text.
Un astfel de stil de comunicare nu este atractiv pentru utilizatori, motiv pentru care se preferă dialogul prin interfețe grafice sau GUI (Graphical User Interface), ecranul fiind folosit în mod grafic.
În momentul actual, există două modalități de a crea o aplicație cu interfață grafică:
Componentele Swing, spre deosebire de predecesoarele din versiunile Java anterioare, sunt implementate în întregime în Java. Aceasta are ca rezultat o mai bună compatibilitate cu platforme diferite decât în cazul folosirii componentelor AWT.
Unul din principalele deziderate ale tehnologiei Swing a fost să pună la dispoziție un set de componente GUI extensibile care să permită dezvoltarea rapidă de aplicații Java cu interfață grafică competitivă, din punct de vedere comercial.
Cel mai important pachet, care conține componentele de bază este javax.swing.
Orice interfață utilizator Java este compusă din următoarele elemente:
Clasa JFrame este cea pe care o vom folosi pentru a crea ferestre. Ca orice altă clasă care reprezintă componente Swing ea se află în pachetul javax.swing.
Pentru că este un container, vom folosi, de cele mai multe ori, această clasă prin moștenire nu prin instanțiere. Altfel spus, vom crea clase care să reprezinte ferestre și pentru ca acestea să devină ferestre de tip JFrame ele vor moșteni această clasă.
public class Fereastra extends JFrame { private JButton button; public Fereastra(String text) { super(text); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setMinimumSize(new Dimension(300, 200)); getContentPane().setBackground(Color.blue); setLayout(new SpringLayout()); button = new JButton("Apasa"); add(button); show(); pack(); } public static void main(String args[]) { Fereastra f = new Fereastra("Laborator POO"); } }
Un buton poate fi creat folosind clasa JButton. De obicei, butonul este construit folosind unul dintre constructorii:
Textul de pe buton poate fi modificat folosind metoda setText(String text) sau poate fi preluat folosind metoda getText().
class Button extends JFrame implements ActionListener { private JButton button; public Button(String text) { super(text); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setMinimumSize(new Dimension(300, 200)); getContentPane().setBackground(Color.blue); setLayout(new SpringLayout()); button = new JButton("Apasa"); button.addActionListener(this); add(button); show(); pack(); } public static void main(String args[]) { Button b = new Button("LaboratorPOO"); } @Override public void actionPerformed(ActionEvent e) { /* JButton button = (JButton)e.getSource(); if (button.getText().equals("Apasa")) // valabil dacă aveam mai multe butoane ascultate de acest ascultător */ System.out.println("Butonul a fost apasat!"); } }
Butonul JButton este sensibil la evenimente de tip ActionEvent, așadar, modalitatea de atașare a ascultătorilor și de creare evenimente este similară butoanelor Button din pachetul java.awt.
Vom folosi trei tipuri de componente text: JTextField, JTextArea și JPasswordField.
Pentru a modifica textul dintr-un câmp de text, se folosește metoda setText(String text).
Componenta JTextArea are în comportament și metoda append(String text) care permite adăugarea unui text la componentă.
class Text extends JFrame implements ActionListener { private JButton button; private JTextField user; private JPasswordField pass; public Text(String text) { super(text); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setMinimumSize(new Dimension(300, 200)); getContentPane().setBackground(Color.blue); setLayout(new FlowLayout()); button = new JButton("Apasa"); button.addActionListener(this); add(button); user = new JTextField(15); add(user); pass = new JPasswordField(15); add(pass); show(); pack(); } public static void main(String args[]) { Text b = new Text("LaboratorPOO"); } @Override public void actionPerformed(ActionEvent e) { /* JButton button = (JButton)e.getSource(); if (button.getText().equals("Apasa")) // valabil dacă aveam mai multe butoane ascultate de acest ascultător */ System.out.println(user.getText() + pass.getText()); } }
Clasele JCheckBox și JRadioButton definesc componente de tip butoane de selecție.
Standard, butoanele JCheckBox sunt folosite pentru a crea liste de opțiuni de tip multiple-choice (din care poți selecta mai multe variante), iar JRadioButton pentru crearea de liste de tip single-choice (din care se poate selecta o singură opțiune).
ButtonGroup definește un grup de butoane. Din butoanele ce aparțin aceluiași grup, nu putem selecta decât o singură opțiune.
Ambele tipuri de componente se creează similar butoanelor JButton. În general, acestea nu sunt folosite cu evenimente și prin verificări ale stărilor acestora (se verifică dacă este sau nu selectat la un anumit eveniment).
Verificarea stării unei astfel de componente se face folosind metoda isSelected() care returnează true dacă butonul este bifat și false dacă nu este bifat.
JScrollPane este o componentă folosită pentru adăugarea de bare de defilare pentru o altă componentă care ar putea depăși dimensiunile containerului în care este adăugată.
Instanța JScrollPane nu este folosită în acțiunile directe pe care le are componenta pe care o susține. La construirea instanței, i se dă o componentă pentru care este creată și pe care adaugă bare de defilare (scrollbars).
Apoi, instanța JScrollPane este adăugată pe container în locul componentei din instanța JScrollPane.
class Text extends JFrame { private JTextArea textArea; private JScrollPane scroll; public Text(String text) { super(text); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setMinimumSize(new Dimension(300, 200)); getContentPane().setBackground(Color.blue); setLayout(new FlowLayout()); textArea = new JTextArea(200, 100); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setFont(new Font("Tahoma", 2, 12)); scroll = new JScrollPane(textArea); add(scroll); show(); pack(); } public static void main(String args[]) { Text b = new Text("LaboratorPOO"); } }
O etichetă reprezintă cea mai simplă componentă. Aceasta este folosită pentru afișarea unui text static în cele mai multe cazuri.
Textul de pe o etichetă poate fi modificat sau preluat folosind metodele getText() și setText(String text).
Un eveniment este produs de o acțiune a utilizatorului asupra unei componente grafice și reprezintă mecanismul prin care utilizatorul comunică efectiv cu programul.
Exemple de evenimente sunt:
Interceptarea evenimentelor generate de componentele unui program se realizează prin intermediul unor clase de tip listener (ascultător, consumator de evenimente).
În Java, orice obiect poate “consuma” evenimente, cu condiția ca acesta să implementeze interfața listener corespunzătoare tipului de eveniment pe care dorește să-l intercepteze.