Графични интерфейси с Java

Основни понятия

Разликата между конзолна програма и програма с графичен интерфейс е в управлението на събитията.
•    В първия случай, програмата управлява потребителя изисквайки от него доставянето на информация в определени моменти. Диалогът се води в текстов прозорец наречен конзола.
•    Във втория случай потребителят управлява програмата, която реагира на негови команди, които той отправя чрез събития върху компоненти (прозорзи, бутони, текстови компоненти ...).

компонент – базов обект от потребителския интерфейс; всичко, което се изобразява на екрана: прозорци, зони за рисуване, бутони, полета за отметки, текстови полета, скролиращи ленти

Всеки компонент притежава атрибути като видимост, размер, позиция, цвят.

Действията извършвани от потребителя изпращат събития към компонентите чрез методите за управление на събитията.

контейнер – обединява група компоненти, предоставя ги за изобразяване и ги свързва с някаква периферия.

За да може да бъде използван компонентът трябва да се вмъкне в контейнер.

От своя страна всеки контейнер може да се използва като компонент.

Компонентите делегират известни права на контейнерите, които ги съдържат. Вместо да обработи дадено събитие, компонентът може да го прехвърли на своя контейнер. Компонентите в контейнера получават информация за операциите които засягат други компоненти , като например промяна на големината или видимостта. Контейнерът получава информация дали трябва да бъде прерисуван. 

AWT 

Abstract Windowing Toolkit (AWT) предоставя голямо количество класове за конструиране на графични потребителски интерфейси(GUI) на Java. Чрез AWT могат да се създават прозорци, да се рисува, да се манипулират избражения, да се използват компоненти като бутони, падащи менюта и скролиращи ленти. Класовете включени в AWT са събрани в пакет java.awt.

AWT е разделена на две части - едната предоставя инструментални средства като бутони, полета с отметки, текстови полета и други подобни компоненти. Втората предоставя срества за рисуване и изобразяване на изображения.

AWT представлява една абстракция. Приложенията функционират по еднакъв начин върху различни платформи. AWT се базира на инструментални средтва, които използуват приложния прозоречен API и по този начин отделят кода на приложението от детайлите на реализацията върху конкретната машина.


 
 




Swing

Swing предоставя  усъвършенстван набор от GUI компоненти, в сравнение с по-стария  Abstract Window Toolkit (AWT). Swing предлага look and feel  емулирано на различни платформи, което позволява на приложенията да изглеждат и да се чувстват несвързани с основната платформа. Той има по-мощни и гъвкави компоненти от AWT.  Swing предлага няколко усъвършенствани компонента, като панел с табове, прозорци за превъртане, дървета, таблици и списъци. 

За разлика от AWT компонентите, Swing компонентите не се изпълняват от специфичен за платформа код. Вместо това, те са написани изцяло в Java и следователно са независими от платформата. Терминът "лек" се използва за описание на такъв елемент 

Начинът на работа в двете графични системи е идентичен. Двете системи позволяват съвместна работа. Нещо повече част от Swing компонентите са базирани върху AWT компоненти.

Component                                                                        AWT

      Label                                                                             AWT

      Container                                                                     AWT

             JComponent

                   JLabel

                   JComboBox

                   AbstractButton

                         JButton

                         JToggleButton

                                JCheckBox

                                JRadioButton

                   JMenuItem

                         JMenu

                         JCheckBoxMenuItem

                   JMenuBar

                   JPanel

                   JToolBar

                   JScrollPane

                   JTabbedPane

                   JSplitPane

                   JTextComponent

                         JTextField

                         JTextArea

                         JEditorPane

                   JList

                   JTree

                   JTable

             Window                                                                  AWT

                   Frame                                                               AWT

                         JFrame

                   Dialog                                                              AWT

                         JDialog

                   Jwindow



JFrame

import javax.swing.* ;
public class Window1 {
         public static void main (String args[]){
                JFrame wd = new JFrame() ;
                wd.setSize (250, 100) ;
                wd.setTitle ("graphic window") ;
                wd.setVisible (true) ;
         }
}


wd.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
wd.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);                        // default)
wd.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
wd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

import java.awt.event.*;
import javax.swing.* ;
public class Window1 {
         public static void main (String args[]){
                JFrame wd = new JFrame() ;
                wd.setSize (250, 100) ;
                wd.setTitle ("graphic window") ;
                wd.setVisible (true) ;
                wd.addWindowListener(new WndCls());
         }
         // To close the graphic thread:
         static class WndCls extends WindowAdapter {
                public void windowClosing(WindowEvent e) {
                      System.exit(0);
                }
         }
}

import javax.swing.* ;
public class Window1 {
         public static void main (String args[]){
                JFrame wd = new JFrame() ;
                wd.setSize (250, 100) ;
                wd.setTitle ("graphic window") ;
                wd.setVisible (true) ;
                wd.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         }   
}


Промени в характеристиките на  JFrame

import javax.swing.* ;
public class MyFrame extends JFrame{
         MyFrame(int x, int y, int ln, int ht){
                this.setBounds(x, y, ln, ht);
                this.setVisible(true);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         }
}

import java.util.*;
public class Test1 {
         public static void main(String arg[]){
                MyFrame mf = new MyFrame(50,80,200,150);
                mf.setSize (250, 100) ;
                mf.setTitle ("graphic window") ;
                mf.setVisible (true) ;
                Scanner in = new Scanner(System.in);
                System.out.print("new name: ");
                String s = in.nextLine();
                mf.setTitle (s);
                System.out.println("boundaries modified ");
                mf.setBounds(60,45,200,120);      //x, y of the upper left corner, length, height
                System.out.print("new length ");
                int ln= Integer.parseInt(in.nextLine());
                System.out.print("new height ");
                int height= Integer.parseInt(in.nextLine());
                mf.setSize (ln,height);
                System.out.print("enter to make invisible:");
                in.nextLine();
                mf.setVisible(false);
                System.out.print("enter to make visible:");
                in.nextLine();
                mf.setVisible(true);
                System.out.print("enter to finish program");
                in.nextLine();
                System.exit(1);
         }
}

Мишка в JFrame

class MyMouse implements MouseListener {
         public void mouseClicked (MouseEvent ev) { ..... }
         public void mousePressed (MouseEvent ev) { ..... }
         public void mouseReleased(MouseEvent ev) { ..... }
         public void mouseEntered (MouseEvent ev) { ..... }
         public void mouseExited (MouseEvent ev) { ..... }

}

-----------------------------------------------------------------------------------------

import java.awt.Color;
import java.awt.event.*;
import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addMouseListener(new MyMouse());
    }
    public class MyMouse implements MouseListener{
        public void mouseClicked(MouseEvent ev) {
            int x,y;
            System.out.println("x="+(x=ev.getX()) +   " y="+ (y=ev.getY()));
            MyFrame.this.getGraphics().drawRect(x, y, 3, 3);
        }
        public void mousePressed (MouseEvent ev) {}
        public void mouseReleased(MouseEvent ev) {}
        public void mouseEntered (MouseEvent ev) {
            System.out.println("mouse in");
            MyFrame.this.getContentPane().setBackground(Color.GREEN);
        }
        public void mouseExited (MouseEvent ev) {
            System.out.println("mouse out");
            MyFrame.this.getContentPane().setBackground(Color.LIGHT_GRAY);
        }
    }
}


public class Test {
         public static void main(String arg[]){
                MyFrame mf = new MyFrame(50,80,200,150);
         }
}

Adapter

class MouseAdapter implements MouseListener {
         public void mouseClicked (MouseEvent ev) {}
         public void mousePressed (MouseEvent ev) {}
         public void mouseReleased(MouseEvent ev) {}
         public void mouseEntered (MouseEvent ev) {}
         public void mouseExited (MouseEvent ev) {}
}

--------------------

public class MyMouse extends MouseAdapter {
         public void mouseClicked(MouseEvent ev) {
                System.out.println("x="+ev.getX() + " y="+ ev.getY());
         }
         public void mouseEntered (MouseEvent ev) {
                System.out.println("mouse in");
         }
         public void mouseExited (MouseEvent ev) {
                System.out.println("mouse out");
         }
}

Някои събития и съответните им слушатели 

За всяко действие върху компонент в резултат на което се получава събитие Xxx, се асоциира обект - слушател (от тип XxxEvent), чрез метод  addXxxListener. Всеки път, когато слушателят притежава няколко метода трябва

Едно събитие може да бъде слушано от много слушатели, които се изпълняват един след друг.

Някои събития и съответните им слушатели

Действия в резултат, на които се получава събитие тип на слушателя
"clicks" на бутон, "Enter" в текстово поле или избор на
 "menu item"
ActionListener
затваряне на   "frame" (main window) WindowListener
"clicks" на бутон на мишката, когато "cursor" се намира
върху компонент
MouseListener
преместване на нишката върху компонент MouseMotionListener
компонентът става видим ComponentListener
компонентът влиза във фокуса на клавиатурата FocusListener
промяна в избора на даден "list" ListSelectionListener
промяна на характеристиките(като текст или  "label")
на компонента
PropertyChangeListener

JButton

import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(String name,int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle(name);
    }
}

import javax.swing.*;
public class Test {
    public static void main(String arg[]){
        MyFrame mf = new MyFrame("ButtonOne",50,80,200,150);
        JButton bt1 = new JButton("butt1");
        mf.add(bt1);                       // Layout) by defaut
        mf.validate();                     // validate контейнера
    }
}

setLayout

import java.awt.*;
import javax.swing.*;
public class Test {
    public static void main(String arg[]){
        MyFrame mf =
             new MyFrame("ButtonOne",50,80,200,150);
        mf.setLayout(new FlowLayout());    
        JButton bt1 = new JButton("butt1");
        JButton bt2 = new JButton("butt2");
        mf.add(bt1);
        mf.add(bt2);
        mf.validate();
    }
}

скриване на бутон - setVisible(false)

Listener

import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(String name,int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setTitle(name);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
-------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
    static int cnt1=0,cnt2=0;
    public static void main(String arg[]){
        MyFrame mf = new MyFrame("ButtonOne",50,80,200,150);
        mf.setLayout(new FlowLayout());
        JButton bt1 = new JButton("butt1");     JButton bt2 = new JButton("butt2");
        mf.add(bt1);            
        mf.add(bt2);
        bt1.addActionListener(new Bt1());
        bt2.addActionListener(new Bt2());
        mf.validate();
    }
    static class Bt1 implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            System.out.println("butt1: "+ ++cnt1+" times clicked");          
        }
    }
    static class Bt2 implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            System.out.println("butt2: "+ ++cnt2+" times clicked");          
        }
    }
}

Използва обекти от два различни класа за слушател

getSource()

Прилага се към всички компоненти, позволява използването на един и същи обект за слушане на повече компненти. Използва се за анализиране на референцията на обекта, върху който е извършено действие

import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(String name,int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setTitle(name);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
----------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test1 {
    static int cnt1=0,cnt2=0;
    static JButton bt1,bt2;
    static Bt btLs;
    public static void main(String arg[]){
        MyFrame mf = new MyFrame("One Listener",50,80,200,150);
        mf.setLayout(new FlowLayout());
        bt1 = new JButton("butt1");
        bt2 = new JButton("butt2");
        mf.add(bt1);
        mf.add(bt2);
        btLs = new Bt();
        bt1.addActionListener(btLs);
        bt2.addActionListener(btLs);
        mf.validate();
    }
    static class Bt implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            if (ev.getSource() == bt1){
                System.out.println("butt1: "+ ++cnt1+" times clicked");
            }
            if (ev.getSource() == bt2){
                System.out.println("butt2: "+ ++cnt2+" times clicked");
            }
        }
    }
}

getActionCommand()

Прилага се към компоненти с команден стринг - бутони, опции на менюта, checkbox. Анализира командния стринг.

static class Bt implements ActionListener{
    public void actionPerformed(ActionEvent ev){
        if (ev.getActionCommand().equals("butt1")){
            System.out.println("butt1: "+ ++cnt1+" times clicked");
        }
        if (ev.getActionCommand().equals("butt2")){
            System.out.println("butt2: "+ ++cnt2+" times clicked");
        }
    }
}

Добавяне и премахване на компоненти

За прерисуване:

revalidate() - за компонента
validate() (или repaint() в някои случаи) за контейнера

import java.awt.event.*;
import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(String name,int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setTitle(name);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
----------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
    static JButton bt=null;
    static MyFrame mf=null,mfc=null;
    public static void main(String arg[]){
        mfc = new MyFrame("ButtonControl",10,80,200,150);
        mfc.setLayout(new FlowLayout());
        mf = new MyFrame("Buttons",10,250,200,150);
        mf.setLayout(new FlowLayout());
        JButton btc1=new JButton("add a new button");
        btc1.addActionListener(new AdBt());
        mfc.add(btc1);
        JButton btc2 = new JButton("remove the button");
        btc2.addActionListener(new RmBt());
        mfc.add(btc2);
        mfc.validate();
    }
    static class AdBt implements ActionListener{       
        public void actionPerformed(ActionEvent arg0) {
            if(bt == null){
                bt = new JButton("added button");
                mf.add(bt);
                mf.validate(); //or bt.revalidate();
            }           
        }
    }
    static class RmBt implements ActionListener{       
        public void actionPerformed(ActionEvent arg0) {
            if(bt != null){
                mf.remove(bt);
                mf.setVisible(false);
                mf.setVisible(true);   // ou mf.repaint();
                bt = null;
            }
        }
    }
}

Активиране/дезактивиране на компоненти (забрана произвеждане събитие)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyFrame extends JFrame{
    MyFrame(String name){
        this.setBounds(200, 250, 250, 200);
        this.setVisible(true);
        this.setTitle(name);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
//----------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
    static JButton bt[];
    public static void main(String arg[]){
        MyFrame mf = new MyFrame("activate/desactivate");
        bt = new JButton[4];
        mf.setLayout(new FlowLayout());
        Activ act = new Activ();
        bt[0]= new JButton("activate all");
        mf.add(bt[0]);
        bt[0].addActionListener(act);
        for(int i=1;i<bt.length;i++){
            bt[i]= new JButton("desactivate "+ i);
            mf.add(bt[i]);
            bt[i].addActionListener(new Desactiv(i));
        }
        mf.validate();
    }
    static class Desactiv implements ActionListener{
        int n;
        Desactiv(int n){     this.n = n; }
        public void actionPerformed(ActionEvent ev) {
            bt[n].setEnabled (false) ;        
        }       
    }
    static class Activ implements ActionListener{       
        public void actionPerformed(ActionEvent ev) {
            for(int i = 1; i<bt.length; i++){
                bt[i].setEnabled (true) ;
            }                       
        }       
    }
}

JPanel

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
    static Button bt1,bt2,bt3,bt4;
    static JPanel jp1,jp2;
    public static void main(String arg[]){
        MyFrame mfc=new MyFrame(
                        "ButtonControl",10,80,200,150);
        mfc.setLayout(new FlowLayout());
        jp1 = new JPanel(new FlowLayout());
        jp2 = new JPanel(new FlowLayout());
        jp1.setBackground(Color.yellow);
        jp2.setBackground(Color.green);
        mfc.add(jp1);
        mfc.add(jp2);
        bt1 = new Button("show green");
        bt2 = new Button("hide green");
        bt3 = new Button("show yellow");
        bt4 = new Button("hide yellow");
        jp1.add(bt1); jp1.add(bt2);
        jp2.add(bt3); jp2.add(bt4);
        bt1.addActionListener(new Show(2));
        bt2.addActionListener(new Hide(2));
        bt3.addActionListener(new Show(1));
        bt4.addActionListener(new Hide(1));
        mfc.validate();
    }
    static class Hide implements ActionListener{
        int npan;
        Hide(int i){this.npan = i;}
        public void actionPerformed(ActionEvent ev) {
            if(npan == 1)jp1.setVisible(false);
            else jp2.setVisible(false);
        }
    }
    static class Show implements ActionListener{
        int npan;
        Show(int i){    this.npan =i;}
        public void actionPerformed(ActionEvent ev) {
            if(npan == 1)jp1.setVisible(true);
            else jp2.setVisible(true);                    }
    }
}

Рисуване върху компоненти със запазване при прерисуване

За да не се премахне рисунката при прерисуване на компонента, инструкциите за рисуване трябва да се поместят в специален метод на компонента  -  paintComponent(). Метода се вика автоматично  всеки път, когато компонента трябва да се прерисува.
Трябва също да се извика явно и метода paintComponent() на неговия базов клас..

import java.awt.event.*;
import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(String nm,int x, int y, int ln, int ht){
        this.setBounds(x, y, ln, ht);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle(nm);
    }
}
----------------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
    static JPanel jp1;  
    public static void main(String arg[]){
        MyFrame mfc = new MyFrame(
                "panel draw",10,80,400,300);
        jp1 = new MyPanel();
        mfc.add(jp1);
        mfc.validate();
    }
    static class MyPanel extends JPanel{
        public void paintComponent(Graphics g){
            super.paintComponent(g) ;
            g.drawLine (15, 10, 100, 50) ;
            g.drawLine(100, 50, 150, 10);
            g.drawOval(60, 150, 50, 80);
            g.drawOval(120, 150, 80, 50);
            g.drawRect(240, 150, 80, 80);
            g.drawOval(240, 150, 80, 80);
        }
    }
}    


Рисуване от потребителя 

Тези рисунки изчезват при при прерисуване на компонента. Необходимо е:
•   Да се получи графически контекст на компонента с метода getGraphics() (paintComponent() го доставя автоматично като аргумент).
•   Да се приложат операции за рисуване.
•   Да се освободи графичния контекст с dispose() (paintComponent() го прави автоматично).


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

class MyFrame extends JFrame{
    MyFrame () {
        setTitle ("Clics traces") ;
        setSize (300, 150) ;
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pan = new JPanel() ;
        add(pan) ;
        pan.addMouseListener (new MyListener(pan)) ;
    }
    private JPanel pan ;
}
class MyListener extends MouseAdapter {
    int xPrev=-1,yPrev=-1;
    public MyListener (JPanel pan)    {
        this.pan = pan ;
    }
    public void mouseClicked (MouseEvent ev) {
        int x = ev.getX(), y = ev.getY() ;
        Graphics g = pan.getGraphics() ;
        g.drawRect (x, y, 5, 5) ;
        if(xPrev>=0)g.drawLine(xPrev,yPrev,x,y);
        xPrev=x; yPrev=y;
        g.dispose();
    }
    private JPanel pan ;
}
public class Clics {
    public static void main (String args[]){
        MyFrame mf = new MyFrame() ;
        mf.setVisible(true) ;
    }
}

Рисуване от потребителя със запазване при прерисуване

Отново е необходимо инструкциите за рисуване да се поместят в метода на компонента  -  paintComponent(), който трябва да ползва цикъл за рисуване и да бъде викан при всяко действие на потребителя  с repaint(). Нека да има максимално 200 кликания:


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

class MyFrame extends JFrame{
    private MyPanel pan ;
    MyFrame () {
        setTitle ("Clics traces") ;
        setSize (300, 150) ;
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pan = new MyPanel() ;
        add(pan) ;
    }

}
class MyPanel extends JPanel {
    private final int size = 200;      //max coordinates
    private int xc[],yc[];             //coordinates
    private int nc;                    //number of coordinates
    MyPanel(){
        nc=0;
        xc = new int[size];
        yc = new int[size];
        this.addMouseListener(new MyMouse());
    }

    class MyMouse extends MouseAdapter{
        public void mouseClicked (MouseEvent ev) {
            if(nc<size) {
                xc[nc]=ev.getX();
                yc[nc++]=ev.getY();
                System.out.println(xc[nc-1]);
                repaint();
            }
        }
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for(int i =0;i<nc;i++) {
            g.drawRect (xc[i], yc[i], 5, 5) ;
            if(i>0)g.drawLine(xc[i-1],yc[i-1],xc[i],yc[i]);

        }
    }
}
public class Click {
    public static void main (String args[]){
        MyFrame mf = new MyFrame() ;
        mf.setVisible(true) ;
    }
}

Check boxes

import java.awt.*;
import javax.swing.* ;
public class MyFrame extends JFrame{
    MyFrame(String name, int x, int y, int len, int hi){
        this.setBounds(x, y, len, hi);
        this.setVisible(true);
        this.setLayout(new FlowLayout());
        this.setTitle(name);
        this. setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

//-------------------------------------------------
import java.awt.event.*;
import javax.swing.* ;
public class Test {
    static JCheckBox chck1,chck2;
    static Vrfy vr = new Vrfy();
    public static void main(String arg[]){
        MyFrame fm=new MyFrame("Chck", 10, 10, 350,250);
        chck1 = new JCheckBox ("Test",true) ;
        JButton bt1 = new JButton("vtfy");
        chck2 = new JCheckBox ("Test 1") ;    

        JButton bt2 = new JButton("cnvrt");
        fm.add(chck1);
        fm.add(bt1);
        fm.add(chck2);
        fm.add(bt2);
        chck1.addActionListener(vr);              
// при действие върху компонентата
        chck2.addItemListener(new Vrfy1());  // при промяна състоянието на компонентата
        bt1.addActionListener(vr);
        bt2.addActionListener(new Cnvrt());
        fm.validate();
    }
    static class Vrfy implements ActionListener{    
        public void actionPerformed(ActionEvent ev){
            System.out.println("Echck1:"+chck1.isSelected());
            System.out.println("Echck2:"+chck2.isSelected()+"\n");
        }
    }
    static class Vrfy1 implements ItemListener{   //
        public void itemStateChanged (ItemEvent ev){
            System.out.println("Ichck1:"+chck1.isSelected());
            System.out.println("Ichck2:"+chck2.isSelected()+"\n");
        }
    }
    static class Cnvrt implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            if (chck1.isSelected())chck1.setSelected(false);
            else chck1.setSelected(true);
            if (chck2.isSelected())chck2.setSelected(false);
            else chck2.setSelected(true);           
        }
    }
}

Радио бутони

import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.* ;
import javax.swing.border.TitledBorder;

public class TestRadio {
    static  MyFrame fm=new MyFrame("Radio Buttons",10,400,350,250);
    static JRadioButton bt1,bt2,bt[];
    static ButtonGroup grp1,grp2;
    static JPanel p1,p2;
    public static void main(String arg[]){       
        bt1=new JRadioButton("Test1");
        bt2= new JRadioButton("Test2", true);
        p1 = new JPanel(new FlowLayout());
        p2 = new JPanel(new FlowLayout());
        grp1 = new ButtonGroup();
        grp2 = new ButtonGroup();
        grp1.add(bt1);
        grp1.add(bt2);
        p1.add(bt1); p1.add(bt2);
        p1.setBorder(new TitledBorder("pan1 -choose option"));
        p2.setBorder(new TitledBorder("pan2 -choose option"));
        fm.add(p1); fm.add(p2);
        bt = new JRadioButton[5];
        for(int i=0;i<bt.length;i++){
            bt[i]= new JRadioButton("bt "+i);
            grp2.add(bt[i]);
            p2.add(bt[i]);
            bt[i].addItemListener(new Vrfy());
        }
    }
    static class Vrfy implements ItemListener{
        public void itemStateChanged (ItemEvent ev){
            for(int i=0;i<bt.length;i++){
                System.out.println("bt["+i+"] "+bt[i].isSelected());
            }
            System.out.println("\n\n");
        }
    }
}

Текстови полета и области

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyFrame extends JFrame implements ActionListener,FocusListener{
    JTextField tf1,tf2,tf3;
    JTextArea ta;
    MyFrame(){                                   
        this.setSize(300,300);
        this.setLayout(new FlowLayout());
        tf1 = new JTextField("initial", 10);   
        tf2 = new JTextField(10);
        tf3 = new JTextField(10);
        ta = new JTextArea(5,10);
        tf2.setEditable(false);                   
        this.add(tf1);       
        this.add(tf2);
        this.add(tf3);
        this.add(new JScrollPane(ta));
        tf3.addActionListener(new AdTa());
        tf1.addActionListener(this) ;           
        tf1.addFocusListener(this) ;    
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }  
    public void actionPerformed(ActionEvent ev){
        tf2.setText(tf1.getText());
    }
    public void focusGained (FocusEvent e){
        System.out.println("Get focus tf1");      
    }
    public void focusLost (FocusEvent e){
        System.out.println("Lost focus tf1");
    }
    class AdTa implements ActionListener{
        public void actionPerformed(ActionEvent arg0) {
            ta.append(tf3.getText()+"\n");
            //  ta.setCaretPosition(ta.getDocument().getLength());   // force caret to the end
            tf3.setText("");           
        }      
    }
    public static void main(String arg[]){
        MyFrame mf = new MyFrame();      
    }
}

Менюта

Три стъпки :
•    Обект  JMenuBar (може да има само 1 във фрейма);
•    Различни обекти менюта  – JMenu, които се визуализира в JMenuBar;
•    За всяко меню - различни падащи опции, които го съставят.

import java.awt.*;
import java.awt.event.* ;
import javax.swing.* ;
class MyMenu extends JFrame {
    JMenuBar mb;
    JTextField t;
    public MyMenu () {
        setTitle ("Menu example") ;
        setSize (200, 220) ;
        t = new JTextField(3);
        setLayout(new FlowLayout());
        add(t);
        ActionListener al = new ActionListener() {
            public void actionPerformed(ActionEvent ev){
                t.setText(
                        ((JMenuItem)ev.getSource()).getText());
            }
        };   
        mb = new JMenuBar() ;
        JMenu[] menus = { new JMenu("menu 1"),
            new JMenu("menu 2"), new JMenu("menu 3")};
        for(int i = 0; i < menus.length; i++)
            mb.add(menus[i]);
        setJMenuBar(mb);
        JMenuItem[] items = {
            new JMenuItem("it1"), new JMenuItem("it2")};
        for(int i = 0; i < items.length; i++){
            items[i].addActionListener(al);
            menus[0].add(items[i]);
        }
        menus[0].addSeparator();
        ButtonGroup group = new ButtonGroup() ;
        JRadioButtonMenuItem bt[] = {
            new JRadioButtonMenuItem("bt1"),
            new JRadioButtonMenuItem("bt2")};
         bt[0].setToolTipText ("attention - radio button!") ; // tooltip
        for(int i = 0; i < bt.length; i++){
            group.add(bt[i]);
            bt[i].addActionListener(al);
            menus[0].add(bt[i]);
        }
        menus[0].addSeparator();
        JCheckBoxMenuItem cb[]= {new JCheckBoxMenuItem("chk1"),
            new JCheckBoxMenuItem("chk2"),new JCheckBoxMenuItem("chk3")};
        for(int i = 0; i < cb.length; i++){
            menus[0].add(cb[i]);
            cb[i].addActionListener(al);
        }
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    public static void main(String arg[]){
        MyMenu fm = new MyMenu();
    }
}

Шрифт и цвят


import javax.swing.* ;

import java.awt.* ;
import java.awt.event.*;
class Test extends JFrame {
    JPanel pan;
    Test (){
        setTitle ("Fonts") ;
        setSize (220, 150) ;
        pan = new MyPanel() ;
        add(pan) ;
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }  

    class MyPanel extends JPanel {
        public void paintComponent(Graphics g){
            super.paintComponent(g) ;
            FontMetrics fm = g.getFontMetrics() ;
            String fnts[] = GraphicsEnvironment.getLocalGraphicsEnvironment()
                    .getAvailableFontFamilyNames() ;
            int x=10, y=20;
            setForeground(Color.blue);
            setBackground(Color.yellow);
            g.drawString("by default: "+g.getFont().getFontName()+
                    g.getFont().getSize(),x,y);                                       
            y+=fm.getHeight()+10;
            Font fn = new Font ("Serif", Font.BOLD+Font.ITALIC, 20) ;                  
            g.setFont(fn);
            g.drawString (fn.getFontName()+" 20", x, y) ;
            fn = new Font(fnts[3],Font.PLAIN, 25);                              
            y+=fm.getHeight()+10;
            g.setFont(fn);
            g.drawString (fn.getFontName()+" 25", x, y) ;
            y+=fm.getHeight()+10;
            g.drawString("Fonts total: "+fnts.length, x, y);
        };
    }
    public static void main(String arg[]){
        new Test();
    }
}