Разликата
между конзолна програма и програма с графичен интерфейс е в
управлението на събитията.
• В първия случай, програмата управлява
потребителя изисквайки от него доставянето на информация в определени
моменти. Диалогът се води в текстов прозорец наречен конзола.
• Във втория случай потребителят управлява
програмата, която реагира на негови команди, които той отправя чрез
събития върху компоненти (прозорзи, бутони, текстови компоненти ...).
компонент – базов обект от потребителския интерфейс; всичко, което се изобразява на екрана: прозорци, зони за рисуване, бутони, полета за отметки, текстови полета, скролиращи ленти …
Всеки компонент притежава атрибути като видимост, размер, позиция, цвят.
Действията извършвани от потребителя изпращат събития към компонентите чрез методите за управление на събитията.
контейнер – обединява група компоненти, предоставя ги за изобразяване и ги свързва с някаква периферия.
За да може да бъде използван компонентът трябва да се вмъкне в контейнер.
От своя страна всеки контейнер може да се използва като компонент.
Компонентите делегират известни права на контейнерите, които ги съдържат. Вместо да обработи дадено събитие, компонентът може да го прехвърли на своя контейнер. Компонентите в контейнера получават информация за операциите които засягат други компоненти , като например промяна на големината или видимостта. Контейнерът получава информация дали трябва да бъде прерисуван.
Abstract Windowing Toolkit (AWT) предоставя голямо количество класове за конструиране на графични потребителски интерфейси(GUI) на Java. Чрез AWT могат да се създават прозорци, да се рисува, да се манипулират избражения, да се използват компоненти като бутони, падащи менюта и скролиращи ленти. Класовете включени в AWT са събрани в пакет java.awt.
AWT е разделена на две части - едната предоставя инструментални средства като бутони, полета с отметки, текстови полета и други подобни компоненти. Втората предоставя срества за рисуване и изобразяване на изображения.
AWT представлява една абстракция. Приложенията функционират по еднакъв начин върху различни платформи. AWT се базира на инструментални средтва, които използуват приложния прозоречен API и по този начин отделят кода на приложението от детайлите на реализацията върху конкретната машина.
За разлика от 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
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);
}
}
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 |
import javax.swing.* ;
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.* ;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");
}
}
}
}
Прилага се към компоненти с команден стринг - бутони, опции на менюта, 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) ;
}
}
}
}
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);
}
}
}
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();
}
}