8 tema. Truputis Swingo

Turinys
 AWT ir Swing
 Swing langas
 Komponentes su paveiksleliais
 Kas yra JAR? Verta sužinoti!
 Meniu kūryba
 Suraskite paklydėlį

AWT ir Swing

,,I wish you run Java with a swing" - šį sakinį galima būtų suprasti taip: ,,linkiu jums sėkmingai programuoti Java kalba, t.y. kad viskas vyktų sklandžiai, tarsi būtų sviestu patepta". O sakinį ,,I wish you run Java with Swing" reiktų suprasti kaip palinkėjimą programuojant naudotis Swing paketu (galima suprasti ir kaip palinkėjimą programuoti klausantis swing krypties džiazo).

Kas gi yra tas Swing? Taip buvo pavadintas projektas, kuriuo buvo siekiama sukurti naujus vartotojo grafinės aplinkos kūrimo instrumentus, taigi patobulinti AWT. Kai toks klasių paketas buvo sukurtas jis ir buvo pavadintas Swing. Norint naudotis šio paketo klasėmis reikia programos teksto pradžioje įrašyti eilutę
 import.javax.swing.*;
Šis paketas suteikia mums žymiai daugiau nei AWT galimybių kurti gražiai atrodančias programas. Visos AWT komponentės turi analogus ir pakete Swing. Sudėkime AWT ir atitinkamas Swing paketo komponentes šalia, kad galėtume jas palyginti.

Kaip ir AWT komponentės Swing komponentės generuoja įvykius. Jie registruojami ir reagavimo į juos metodai aprašomi taip pat kaip ir AWT komponenčių įvykių. Abu paketus galima naudoti vienoje programoje.

Swing langas

Programos, kuri naudoja Swing paketo langą rėmai atrodo taip.
	
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class ManoLangas extends JFrame {
	
public ManoLangas() {
setSize(400,300); 
setTitle("Mano programos langas");
		
show();//

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });
}

 public static void main(String args[]) { 
new ManoLangas();
}
}
Tuščią Swing langą galima sukurti dar paprasčiau.
import javax.swing.*;
class TusciasSwingLangas extends JFrame {
	
public TusciasSwingLangas() {
super("Tuščias Swingo Langas");
		
		
setSize(300,300);
show();	}

public static void main(String args[]) {
new TusciasSwingLangas();}
}
Kartais norint vietoje AWT komponentės naudoti Swing komponentę, pakanka komponentės vardo pradžioje pridėti raidę J. Pavyzdžiui,
 
Button mygt = new Button("Mygtukas");//AWT mygtukas
JButton mygt = new JButton("Mygtukas");//Swing mygtukas
Tačiau ne visada to užtenka!

   Į pradžią   

Komponentės su paveikslėliais

Žinome, kaip sukurti AWT mygtruką su užrašu, kaip įdėti į norimą vietą antraštę. Naudojant Swing galime kurti komponentes ne tik su užrašais, bet ir su paveikslėliais. Paveikslėliai, kuriuos naudojame Swing komponentėms papuošti yra ImageIcon objektai, kuriuos galime sukurti iš grafinių failų. Pavyzdžiui, užrašę tokias eilutes sukursime mygtuką, papuoštą paveikslėliu, saugomu faile pav.gif.
ImageIcon icon = new ImageIcon("pav.gif");
JButton mygt = new JButton(icon);
Sukursime programėlę, kuri naudoja mygtukus su paveikslėliais. Be to - paspaudus mygtuką, programos lange patalpinamas užrašas (JLabel objektas), tačiau ne tekstas, bet paveikslėlis!

Štai šios programėlės tekstas.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MygtIvykSwF extends JFrame implements ActionListener{
JButton [] mygt= new JButton [4];
JLabel l;
ImageIcon [] pv = new ImageIcon[4];	
ImageIcon [] pvd = new ImageIcon[4];	

MygtIvykSwF (){

Container cnt = getContentPane();	
setSize(550,400); 
cnt.setLayout(new BorderLayout());
setTitle("Mano programos langas");
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(4,1));

//Dviejuose String tipo duomenų masyvuose saugome paveikslėlių failų vardus 

String [] fail ={"citr.gif", "vyn.gif","pom.gif", "gel.gif"};
String [] faild ={"citrd.gif", "vynd.gif","pomd.gif", "geld.gif"};
for (int i=0; i <4; i++){
//Sukuriame du paveikslėlių masyvus 
pv[i] = new ImageIcon(fail[i]);	
pvd[i] = new ImageIcon(faild[i]);	

mygt[i]=new JButton(pv[i]);
mygt[i].addActionListener(this);
pan.add(mygt[i]);
}
cnt.add("West",pan);
l= new JLabel();	
cnt.add("Center",l);	
show();//

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });
}

public static void main (String arg [])
{new MygtIvykSwF();}
//Kai mygtukas paspaudžiamas, jo spalva pasikeičia, o vietoje 
// antraštės atsiranda paveikslas

public void actionPerformed(ActionEvent ivyk)
{
if (ivyk.getSource()==mygt[0]) {
mygt[0].setBackground(Color.pink); 
mygt[1].setBackground(Color.white); 
mygt[2].setBackground(Color.white); 
mygt[3].setBackground(Color.white); 
l.setIcon(pvd[0]);}

if (ivyk.getSource()==mygt[1]){ 
mygt[1].setBackground(Color.pink); 
mygt[0].setBackground(Color.white); 
mygt[2].setBackground(Color.white); 
mygt[3].setBackground(Color.white); 
l.setIcon(pvd[1]);  }

if (ivyk.getSource()==mygt[2]) 
{mygt[2].setBackground(Color.pink); 
mygt[0].setBackground(Color.white); 
mygt[1].setBackground(Color.white); 
mygt[3].setBackground(Color.white); 
l.setIcon(pvd[2]);}

if (ivyk.getSource()==mygt[3]) 
{mygt[3].setBackground(Color.pink); 
mygt[1].setBackground(Color.white); 
mygt[2].setBackground(Color.white); 
mygt[0].setBackground(Color.white); 
l.setIcon(pvd[3]); }
}}
O štai taip atrodo programos langas:
Atsisiųskite programos failą, tačiau prieš bandydami ją vykdyti perskaitykite kitą skyrelį!

   Į pradžią  

Kas yra JAR? Verta sužinoti!

Programa, kurios langą matote, be pagrindinės klasės naudoja aštuonis grafinius failus: keturiuose yra maži paveikslėliai mygtukams papuošti, ir keturi dideli talpinti vietoje antraščių. Jeigu norėtumėte atsisiųsti ją į savo kompiuterį, turėtumėte atsisiųsti bent devynis failus. Žinoma, juos galima būtų suarchyvuoti ir patalpinti kaip vieną failą. Geriausia tai daryti su Java archyvavimo programa jar . Ji sukuria archyvus, kuriuos galime atpažinti iš plėtinio jar . Darbo su šiais archyvais komandas pateiksime lentelėje.
Veiksmas Komanda
Sukurti jar failą jar cf jar-failas failų vardai
Peržiūrėti jar failo turinį jar tf jar-failas
Išskleisti visus suarchyvuotus failus jar xf jar-failas
Išskleisti pasirinktus failus jar xf jar-failas pasirinkti-failai
Vykdyti suarchyvuotą programą java -jar programa.jar
Vykdyti įskiepį, kurio klasė ir kiti failai suarchyvuoti <applet code=AppletoKlasėsVardas.class
archive="JarFailoVardas.jar"
width=plotis height=aukštis> </applet>
Kai archyvuojamų failų yra daug, galima užuot užrašius visų jų vardus pasielgti paprasčiau. Sudėjus visus reikalingus failus į vieną katalogą, galima visus juos suarchyvuoti įvedus tokią komandą:
jar cf vardas.jar *
Į archyvą bus patalpinti visi tame kataloge esantys failai.

Taigi dabar jau galite vykdyti atsisiųstą programą. Užtenka įvesti tokią komandą:
java -jar mygtukai.jar
Vykdyti suarchyvuotą programą paprasta. Tačiau jeigu norite patys išmokti archyvuoti ir vykdyti programas - perskaitykite skyrelį iki galo. Kitaip jums tikrai nepavyks!

Svarbu žinoti, kad jar programa ne tik suarchyvuoja failus, bet dar ir prideda prie archyvo specialų failą su tam tikra informacija. Literatūroje apie Java šis failas vadinamas archyvo manifestu. Kad suarchyvuota programa būtų pradėta vykdyti įvedus komandą
java -jar programos-vardas.jar
šiame ,,manifeste" turi būti nurodyta kuri iš suarchyvuotų klasių yra pagrindinė, t.y. nuo kurios klasės turi prasidėti programos vykdymas. Jeigu patys tuo nepasirūpinsime, reikalingos nuorodos nebus ir programos įvykdyti nepavyks. Teisingai parengti ,,manifestą" galime taip:
  1. Sukurti tekstinį failą (pav.vardu manif) ir įrašyti jame vieną eilutę:
    Main-Class: pagrindinės-klasės-vardas
  2. Įvesti komandą
    jar cmf manif progr.jar failų-vardai 
Tada programa įtrauks į ,,manifestą" nuorodą, kur ieškoti pagrindinės klasės. Vietoje manif jūs turite, žinoma, įrašyti jūsų parengto failo vardą.
Vertingi patarimai: pagrindinės klasės vardas nurodomas be plėtinio; įrašę į rengiamą failą eilutę Main-Class: pagrindinės-klasės-vardas papauskite Enter klavišą, kitaip informacija iš šio failo į ,,manifestą" gali būti neįtraukta.

   Į pradžią   

Meniu kūryba

Naudojant AWT ir Swing paketus galime kurti programas su įprastiniais pasirinkimo meniu arba įrankių juostomis. Menu kuriame taip:
  1. Sukuriame menu juostą ir ją patalpiname lange:
    JMenuBar  menu_juosta = new JMenuBar();
    setJMenuBar(menu_juosta);
  2. Sukuriame ir ant menu juostos sudedame menu "puslapius":
     JMenu pirmas = new JMenu("Pirmas ");
    menu_juosta.add(pirmas);
    JMenu antras = new JMenu("Antras ");
    menu_juosta.add(antras);
    ....
    
  3. Sukuriame kiekvieno menu ,,puslapio" elementus. Juos susiejame su ,,įvykių registravimo" objektu ir sudedame:
    JMenuItem a = new MenuItem("a");
    a.addActionListener(this);
    pirmas.add(a);
    JMenuItem b = new MenuItem("a");
    b.addActionListener(this);
    pirmas.add(b);
    ....
    
Menu galima kurti naudojant ir AWT ir Swing paketus Štai mažas pavyzdėlis menu kūrimo procesui iliustruoti:
Swing menu AWT menu
O čia šios programų tekstai. Verta atkreipti dėmesį, kad programoje, naudojančioje Swing paketą nėra lango uždarymui skirtų komandų. Swing langą galima ,,tvarkingai" uždaryti ir nenurodžius tų komandų!
import javax.swing.*;
import java.awt.event.*;

class MenuSwing extends JFrame
 implements ActionListener{
JMenuItem a1,b1,c1, a2,b2,c2;
JTextField txt;
JLabel antr;
public MenuSwing() {
super("Programos langas su menu");
		
JMenuBar menu = new JMenuBar();
setSize(200,250);
setJMenuBar(menu);

JMenu pirmas =  new JMenu("1 patiekalas");
menu.add(pirmas);

a1=new JMenuItem("Mišrainė");
a1.addActionListener(this);
pirmas.add(a1);
b1=new JMenuItem("Salotos");
b1.addActionListener(this);
pirmas.add(b1);
c1=new JMenuItem("Kumpis");
c1.addActionListener(this);
pirmas.add(c1);
		
JMenu antras =  new JMenu("2 patiekalas");
menu.add(antras);
		
a2=new JMenuItem("Kepsnys");
a2.addActionListener(this);
antras.add(a2);
b2=new JMenuItem("Žuvis");
b2.addActionListener(this);
antras.add(b2);
c2=new JMenuItem("Spageti");
c2.addActionListener(this);
antras.add(c2);
antr = new JLabel("Swing langas su menu");
getContentPane().add("Center",antr);
txt = new JTextField();
getContentPane().add("South",txt);
show(); }

public void actionPerformed
(ActionEvent ivykis) { 
if (ivykis.getSource()==a2) {
txt.setText("Pasirinkote kepsnį");} 
else {txt.setText("Pasirinkote ne kepsnį"); } }

public static void main(String args[]) {
new MenuSwing();}}
import java.awt.*;
import java.awt.event.*;

class MenuAWT extends Frame
implements ActionListener{
MenuItem a1,b1,c1, a2,b2,c2;
TextField txt;
Label antr;
public MenuAWT() {
super("Programos langas su menu");

MenuBar menu = new MenuBar();
setSize(200,250);
setMenuBar(menu);

Menu pirmas =  new Menu("1 patiekalas");
menu.add(pirmas);
a1=new MenuItem("Mišrainė");
a1.addActionListener(this);
pirmas.add(a1);
b1=new MenuItem("Salotos");
b1.addActionListener(this);
pirmas.add(b1);
c1=new MenuItem("Kumpis");
c1.addActionListener(this);
pirmas.add(c1);

Menu antras =  new Menu("2 patiekalas");
menu.add(antras);

a2=new MenuItem("Kepsnys");
a2.addActionListener(this);
antras.add(a2);
b2=new MenuItem("Žuvis");
b2.addActionListener(this);
antras.add(b2);
c2=new MenuItem("Spageti");
c2.addActionListener(this);
antras.add(c2);
antr = new Label("AWT langas su menu");
setLayout(new BorderLayout());
add("Center",antr);
txt = new TextField();
add("South",txt);
show();

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
} });}

public void actionPerformed
(ActionEvent ivykis) { 
if (ivykis.getSource()==a2) {
txt.setText("Pasirinkote kepsnį");} 
else {txt.setText("Pasirinkote ne kepsnį"); } }
public static void main(String args[]) {
new MenuAWT();}}
Po menu juosta galime patalpinti įrankių juostą, ant kurios galime sudėti dažnai naudojamų įrankių mygtukus. Papildysime langą su Swing menu įrankių juosta, įterpę į programą tokias eilutes:
....
JToolBar irankiai = new JToolBar();
ir1 = new JButton ("1 įrankis");
ir1.setToolTipText("Pirmas įrankis");
ir1.addActionListener(this);
irankiai.add(ir1);
ir2 = new JButton ("2 įrankis");
ir2.setToolTipText("Antras įrankis");
ir2.addActionListener(this);
irankiai.add(ir2);
getContentPane().add("North",irankiai);
...

   Į pradžią   

Suraskite paklydėlį

Tiek išmokus laikas sukurti ką nors įdomesnio. Prisimenate ankstesnio skyrelio programėlę ,,Taikinys". Pasinaudosime tos programėlės idėja ir su Swing paketu sukursime patraukliau atrodantį žaidimą. Jo esmė - surasti pasiklydusį gyvūną.
Atsisiųskite programos failų archyvą.
Programa pradės veikti įvedus komandą
java -jar slepynes.java