Transcript Java 4

JAVA - Serializacja obiektów, interfejs Serializable
import java.io.*; import java.util.*;
public class Prog88{
public static void main(String [] arg) throws IOException, ClassNotFoundException {
Random r = new Random();
class Box implements Serializable {
NamedBox inBox1 = new NamedBox(r.nextInt());
private int i ;
NamedBox inBox2 = new NamedBox(r.nextInt());
Box(int x ) { i =x; }
System.out.println(" inBox1 = " + inBox1.showNamedBox() +
int showInBox() { return i;}
" inBox2 = " + inBox2.showNamedBox());
}
ObjectOutputStream out =
new ObjectOutputStream(new FileOutputStream("obiekty.dat"));
out.writeObject("zapis Box1 i Box 2"); out.writeObject(inBox1);
out.writeObject(inBox2);
out.close();
class NamedBox implements Serializable {
Box a;
NamedBox(int x) { a = new Box(x); }
int showNamedBox() { return
a.showInBox();}
}
ObjectInputStream inp = new ObjectInputStream(new FileInputStream("obiekty.dat"));
String s = (String)inp.readObject(); System.out.println(s);
NamedBox in1 = (NamedBox)inp.readObject(); System.out.println(" in1 = " + in1.showNamedBox());
NamedBox in2 = (NamedBox)inp.readObject(); System.out.println(" in2 = " + in2.showNamedBox());
inp.close(); Obiekt jest odtwarzany wyłącznie na podstawie zapisu, nie są wołane konstruktory
}} //Prog88
101
JAVA - kontola serializacji, interfejs Externalizable
import java.io.*; import java.util.*;
public class Prog89{
public static void main(String [] arg) throws IOException, ClassNotFoundException {
Random r = new Random();
class Test implements Externalizable {
Test in1 = new Test(r.nextInt());
private int i ;
Test in2 = new Test(r.nextInt());
private String s;
public Test() {System.out.println("domyślny"); }
System.out.println(" in1 = " + in1.show() +
// musi być publiczny !!!!
" in2 = " + in2.show());
Test(int x ) { i =x; s = (new Integer(i)).toString(i); }
ObjectOutputStream out =
String show() { return s;}
new ObjectOutputStream
(new FileOutputStream("obiekty.dat"));
public void writeExternal(ObjectOutput out) throws
IOException{
out.writeObject(in1); out.writeObject(in2);
out.writeInt(i);
out.writeObject(s);
}
out.close();
System.out.println(" po odczycie z pliku : " );
public void readExternal(ObjectInput inp) throws
IOException, ClassNotFoundException {
i = inp.readInt(); s = (String)inp.readObject(); } }
ObjectInputStream inp =
new ObjectInputStream(new FileInputStream("obiekty.dat"));
Test in3 = (Test)inp.readObject(); System.out.println(" in1 = " + in3.show());
Test in4 = (Test)inp.readObject(); System.out.println(" in2 = " + in4.show());
inp.close();
Wywoływany jest konstruktor domyślny !!!!!!!!!!!
}
zapis i odczyt na podstawie writeExternal i readExternal
} //Prog89
102
JAVA - wyłączenie z serializacji poprzez transient
import java.io.*; import java.util.*;
public class Prog90{
public static void main(String [] arg) throws IOException, ClassNotFoundException {
Test in1 = new Test(1,"pierwszy");
Test in2 = new Test(2,"drugi");
System.out.println(" in1 = " + in1.showS() + " " + in1.showI() +
class Test implements Serializable {
" in2 = " + in2.showS() + " " + in2.showI());
private transient int i ; // stos. dla Serializable
private String s;
Test(int
x, String t ) { i =x; s = t; }
ObjectOutputStream out =
String showS() { return s;}
new ObjectOutputStream(new FileOutputStream("obiekty.dat"));
int showI() { return i ;}
out.writeObject(in1); out.writeObject(in2);
}
out.close();
System.out.println(" po odczycie z pliku : " );
ObjectInputStream inp = new ObjectInputStream(new FileInputStream("obiekty.dat"));
Test in3 = (Test)inp.readObject();
System.out.println(" in3 = " + in3.showS()+" "+in3.showI());
// -> pierwszy 0
Test in4 = (Test)inp.readObject();
System.out.println(" in4 = " + in4.showS()+" "+in4.showI());
// -> drugi 0
inp.close();
}}// Prog90
103
JAVA - serializacja i deserializacja sieci obiektów do
pojedynczego strumienia
import java.io.*; import java.util.*;
public class Prog91{
public static void main(String [] arg) throws IOException, ClassNotFoundException {
Group l1 = new Group(1);
class Group implements Serializable {
Group l2 = new Group(2);
int nr;
Student s1 = new Student("Marek",l1);
Group(int n ) { nr = n;}
Student s2 = new Student("Pawel",l1);
String gAddres() { return super.toString();}
Student s3 = new Student("Olek ",l2);
int inGroup() {return nr;}
s1.whereIs(); s2.whereIs(); s3.whereIs();
}
class Student implements Serializable {
String s;
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
Group g ;
ObjectOutputStream out = new ObjectOutputStream(byteout);
Student(String t, Group x ) { s = t; g = x;}
out.writeObject(s1); out.writeObject(s2); out.writeObject(s3);
void whereIs() {System.out.println(s + " is in
out.close();
group nr " + g.inGroup() +" ” g.gAddres());}
}
System.out.println(" po odczycie ze strumienia : " );
ByteArrayInputStream byteinp = new ByteArrayInputStream(byteout.toByteArray());
ObjectInputStream inp = new ObjectInputStream(byteinp);
Student s4 = (Student)inp.readObject(); // grupa l1
Student s5 = (Student)inp.readObject(); // grupa l1 Obiekt Group który zawierają s4 i s5 jest tworzony tylko raz
Student s6 = (Student)inp.readObject();
s4.whereIs(); s5.whereIs(); s6.whereIs();
104
inp.close(); }} //Prog91
JAVA - serializacja i deserializacja sieci obiektów - do
wielu strumieni (1)
public class Prog92{
public static void main(String [] arg) throws IOException, ClassNotFoundException {
Group l1 = new Group(1);
Group l2 = new Group(2);
Group l3 = new Group(3);
ArrayList student = new ArrayList();
student.add(new Student("Marek",l1)); student.add(new Student("Pawel",l1)); student.add(new Student("Olek ",l2));
for(int i = 0; i < student.size(); ((Student)student.get(i++)).whereIs());
ByteArrayOutputStream byteout1 = new ByteArrayOutputStream();
ObjectOutputStream out1 = new ObjectOutputStream(byteout1);
out1.writeObject(student);
//kopia poprzez serializację
out1.close();
ByteArrayOutputStream byteout2 = new ByteArrayOutputStream();
ObjectOutputStream out2 = new ObjectOutputStream(byteout2);
out2.writeObject(student);
out2.close();
//-> kontynuacja 
105
JAVA - serializacja i deserializacja sieci obiektów - do
wielu strumieni (2)
System.out.println(" \npo odczycie ze strumienia 1 : " );
ByteArrayInputStream byteinp1 = new ByteArrayInputStream(byteout1.toByteArray());
ObjectInputStream inp1 = new ObjectInputStream(byteinp1);
ArrayList student1 = (ArrayList)inp1.readObject();
for(int i = 0; i < student1.size(); ((Student)student1.get(i++)).whereIs());
inp1.close();
System.out.println(" \npo odczycie ze strumienia 2 : " );
ByteArrayInputStream byteinp2 = new ByteArrayInputStream(byteout2.toByteArray());
ObjectInputStream inp2 = new ObjectInputStream(byteinp2);
ArrayList student2 = (ArrayList)inp2.readObject();
for(int i = 0; i < student2.size(); ((Student)student2.get(i++)).whereIs());
inp2.close();
}
} //Prog92
Deserializując obiekty z różnych strumieni system nie jest w stanie stwierdzić
identyczności tych obiektów
106
JAVA - serializacja i deserializacja sieci obiektów - do
wielu strumieni (3)
class Group implements Serializable {
int nr;
Group(int n ) { nr = n;}
String gAddres() { return super.toString();}
int inGroup() {return nr;}
}
class Student implements Serializable {
String s;
Group g ;
Student(String t, Group x ) { s = t; g = x;}
String sAddres() { return super.toString();}
void whereIs() {System.out.println(s + " adress = " + sAddres() +
" is in group nr " + g.inGroup() +" " + g.gAddres() );}
}
W konsekwencji tworzonych jest dwa razy więcej obiektów
107
JAVA - Aplety
Generalne zasady, aplet nie może:
- odczytywać ani zapisywać plików na komputerze użytkownika,
- komunikować się z inną witryną WWW niż ta, z której został załadowany,
- uruchamiać żadnych programów na komputerze użytkownika,
- ładować ani pobierać z komputera użytkownika żadnych programów.
Aplety powinny być pakowane w pliki JAR .
Aplet:
 działa jako część przeglądarki sieciowej i potrafi reagować na takie zdarzenia jak przeładowanie
strony WWW w jej oknie,
 obsługuje graficzny interfejs użytkownika
W tej części wykładu:
-tworzenie i uruchamianie apletów,
-przykładowe komponenty i obsługa zdarzeń
-grafika i dźwięki w apletach,
-tworzenie łącz w apletach
108
JAVA – Aplety, główne metody
import java.awt.*; //Font, Color, Graphics2D
class Licz { int licz_Init; int licz_Start; int licz_Stop; int licz_Destroy; }
// wszystkie applety musza być public bo JApplet jest public
// wyświetlanie w oknie appletu
public void paint(Graphics oknoAp) {
Graphics2D okno = (Graphics2D)oknoAp;
public class A1 extends javax.swing.JApplet {
private Licz licznik = new Licz();
public void init() {
// inicjalizacja appletu
setBackground(Color.white); // zmiana kolory tła kontenera (tutaj appletu)
licznik.licz_Init++;}
public void start() {
licznik.licz_Start++;}
//uruchamianie appletu,
//przy ponownym ładowaniu strony
public void stop() {
licznik.licz_Stop++;}
// zatrzymywanie appletu,
// przy opuszczeniu strony
okno.drawString("Init : = " +
licznik.licz_Init, 5, 15); // współrzędne
okno.drawString("Start : = "+
licznik.licz_Start, 5, 35);
okno.drawString("Stop : = "+
licznik.licz_Stop, 5, 55);
okno.drawString("Destroy : = "+
licznik.licz_Destroy, 5, 75);
}}
/* umieszczenie appletu na stronie WWW
<applet code = “A1.class” height = “ 100” width = “300”>
public void destroy() {
// sprzątanie po applecie
licznik.licz_Destroy++;
try{
Thread.sleep(5000);
//uśpienie na 5 sekund
} catch(InterruptedException e){
}}
Musisz mieć przeglądarkę z obsługa Javy
</applet>
*/
109
JAVA – Aplety, przykład
import java.awt.*;
//Font, Color, Graphics2D
import java.util.*;
// GregorianCalendar
public class A2 extends javax.swing.JApplet {
private Color bcolor = Color.red; private String lTime;
public void init() { setBackground(bcolor); lTime = new String("?"); }
public void paint(Graphics oknoAppletu) {
Graphics2D okno = (Graphics2D)oknoAppletu;
Font typC = new Font(„Arial",Font.BOLD, 20);
okno.setFont(typC);
GregorianCalendar day = new GregorianCalendar();
String cTime = day.getTime().toString();
okno.setColor(bcolor);
okno.drawString(lTime, 5, 25);
okno.setColor(Color.black);
okno.drawString(cTime, 5, 25);
try{
Thread.sleep(1000);
} catch(InterruptedException e){ }
lTime = cTime;
repaint();
}}
//Arial, BOLD, rozmiar 20 pkt.
// o współrzędnych x = 5, y = 25
//uśpienie na 1 sekundę
// ponowne wywołanie metody paint
110
JAVA – Aplety, testowanie
Testowanie apletu:
Metoda 1)
/*
<applet code = A3 height = 100 width =300>
</applet>
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
Metoda 2)
class ExitWindow extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0);}
}
public class A3 extends javax.swing.JApplet {
import java.awt.*;
public class A3 extends javax.swing.JApplet {
public void paint(Graphics oknoAppletu) {
Graphics2D okno = (Graphics2D)oknoAppletu;
okno.drawString("aplet test", 15, 5);
public void paint(Graphics oknoAppletu) {
Graphics2D okno = (Graphics2D)oknoAppletu;
okno.drawString("aplet test", 5, 25);
}
}
}
JFrame ramka = new JFrame("moja ramka");
Wywołanie: appletviewer A3.java
public static void main(String arg[]){
JApplet aplet = new A3();
ramka.addWindowListener(new ExitWindow());
//obsługa zamknięcia
ramka.getContentPane().add(aplet);
// dodanie jako składnika
ramka.setSize(100,100);
// do kontenera ramka
aplet.init();
aplet.start();
ramka.setVisible(true);}}
111
JAVA – Aplety, umieszczanie na stronach WWW
<applet code = ”A3.class” height = ”100” width =”300”>
</applet>
code – nazwa głównej klasy apletu,
width – szerokość okna apletu,
height – wysokość okna apletu
Jeżeli pliki klas apletu znajdują się w innym folderze niż strona WWW, używa się atrybutu codebase
np. załadowanie klasy A3 z katalogu mapp:
<applet code = ”A3.class” codebase = ”mapp” height = ”100” width =”300”>
</applet>
Jeżeli ładowanie ma odbywać się z innej witryny WWW:
<applet code = ”A3.class” codebase = ”http://www.mojadomena.com/mojkatalog” height = ”100” width =”300”>
</applet>
Inne atrybuty znacznika <applet>
align – określa sposób wyrównania okna apletu w stosunku do strony WWW,
hspace – określa odstęp po lewej i prawej stronie okna apletu w stosunku do innych elementów strony,
vspace – określa odstęp nad i pod oknem apletu.
<applet code = ”A3.class” height = ”100” width =”300” align = LEFT vspace = 50 hspace = 10>
</applet>
112
JAVA – Aplety, przekazywanie parametrów, JAR
<applet code = ”A4.class” height = ”100” width =”300”>
<param name = fonts value = ”TimesRoman”>
<param name = sizes value = ”24”>
</applet>
import java.awt.*;
import javax.swing.*;
public class A4 extends javax.swing.JApplet {
private String czcionka;
private int rozmiar;
public void init(){
czcionka = getParameter("fonts");
rozmiar = Integer.parseInt(getParameter("sizes"));
}
public void paint(Graphics oknoAppletu) {
Graphics2D okno = (Graphics2D)oknoAppletu;
Font type = new Font(czcionka,Font.BOLD, rozmiar);
okno.setFont(type);
okno.drawString("aplet test", 5, 25);
}
}
<applet code = ”A4.class” archives = ”A4.jar”
height = ”100” width =”30
<param name = fonts value = ”TimesRoman”>
<param name = sizes value = ”24”>
</applet>
Tworzenie archiwum:
jar cf A4.jar *.class
//wszystkie pliki class
c – tworzenie archiwum,
f – z podaną nazwą,
113
JAVA – Aplety, JAVA Plug-in
Aby aplety pisane w języku Java 2 mogły działać poprawnie należy korzystać z interpretera Java Plug-in. Aby poprawnie
uruchomić stronę korzystającą z apletów napisanych z wykorzystaniem narzędzi zaimplementowanych po raz pierwszy w
Java 2 muszą być spełnione warunki:
- użytkownik poprawnie zainstaluje Java Plug-in,
- na stronie WWW istnieje fragment kodu inicjujący uruchomienie apletów przez Java Plug-in.
Generowanie kodu wymaganego do obsługi apletów przez Java Plug-in:
- wstaw znacznik <applet> lub <object > na strone WWW
-użyj programu HTMLConverter (www.sun.com)
- przekonwertuj plik HTML do postaci mogącej obsługiwać Java Plug-in
java HTMLConverter dokument.html
Uwaga! użycie HTMLConverter nadpisuje istniejący kod HTML
114
JAVA – Aplety, biblioteka Swing-GUI
/*<applet code = A5 width = 200 height = 150 >
</applet>*/
Wersja A- ostatni składnik przesłania poprzednie
import java.awt.*; import javax.swing.*;
public class A5 extends javax.swing.JApplet {
private JButton b1 = new JButton("OK");
private JButton b2 ;
private JLabel
t = new JLabel("To etykieta");
private JTextField tp = new JTextField("To jest pole tekstowe");
private JTextArea ta = new JTextArea(" To jest obszar tekstowy");
public void init(){
Container p = getContentPane();
//wszystko jest dodawane do kontenera
p.setLayout(new FlowLayout());
// wersja A – bez tej linii
p.add(b1);
ImageIcon i = new ImageIcon("moj.gif");
b2= new JButton("OK",i);
p.add(b2);
p.add(t);
Wersja B – zastosowano szablon
p.add(tp);
p.add(ta);
}}
115
JAVA – Aplety, biblioteka Swing-GUI
import java.awt.*;
import javax.swing.*;
public class A6 extends javax.swing.JApplet {
private JLabel
t = new JLabel("OBSZAR PRZEWIJANY");
private JTextArea ta = new JTextArea(10,10);
public void init(){
Container p = getContentPane();
p.setLayout(new FlowLayout());
//paski przewijania dla jednego z komponentów
JScrollPane pta = new JScrollPane(ta,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollBar b = new JScrollBar(JScrollBar.HORIZONTAL,5,0,0,10);
p.add(b);
p.add(t);
p.add(pta);
}
}
// 5 - wart. start
// 0 - rozmiar suwaka
// 0-10 zakres
116
JAVA – Aplety, biblioteka Swing-GUI
import java.awt.*;
import javax.swing.*;
public class A7 extends javax.swing.JApplet {
private JLabel
t = new JLabel("OPCJE i POLA WYBORU");
public void init(){
Container p = getContentPane();
p.setLayout(new FlowLayout());
JCheckBox b = new JCheckBox("wybierz");
JRadioButton []tab = new JRadioButton [3];
tab[0] = new JRadioButton("one");
tab[1] = new JRadioButton("two",true);
tab[2] = new JRadioButton("three");
JComboBox ocena = new JComboBox();
for(int i = 2; i<=5;i++) ocena.addItem(new Integer(i));
p.add(t);
p.add(b);
for(int i = 0; i<=2;i++)p.add(tab[i]);
p.add(ocena);
}
}
//opcja
//pola wyboru
//lista rozwijana
117
JAVA – Aplety, styl interfejsu
import java.awt.*; import java.util.*; import javax.swing.*;
public class A8 extends javax.swing.JApplet {
private JLabel
t;
public void init(){
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
}catch (Exception e) {System.err.println("nie można");} */
/* try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch (Exception e) {System.err.println("nie można");}
*/
Container p = getContentPane();
t = new JLabel("STYLE UŻYTKOWNIKA");
p.add(t);
}
}
// styl METAL jest domyślny
// styl zgodny z Systemem
118
JAVA – Aplety, okna dialogowe
import java.awt.*; import java.util.*;
import javax.swing.*;
public class A9 extends javax.swing.JApplet {
public void init(){
// null oznacza wyrównanie do środka ekranu
int value1 = JOptionPane.showConfirmDialog(null,"Is OK?");
value2 = JOptionPane.showConfirmDialog(null,"What is ?”,
"Message",JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.ERROR_MESSAGE);
String s = JOptionPane.showInputDialog(null,"Hasło?");
JButton [] bb = new JButton[3]; bb[0] = new JButton("Tak");
bb[1] = new JButton("Nie"); bb[2] = new JButton("Nie odpowiem");
value1 = JOptionPane.showOptionDialog(null, "Palisz?","Ankieta",0,
JOptionPane.QUESTION_MESSAGE,null,
//brak własnej ikony
bb,bb[2]);
// 0 - znaczy ze będą inne przyciski
JOptionPane.showMessageDialog(null,"The end");
}}
119
JAVA – Aplety, szablony rozmieszczenia
import java.awt.*; import java.util.*; import javax.swing.*;
public class A10 extends javax.swing.JApplet {
public void init(){
Container p = getContentPane();
//A p.setLayout(new FlowLayout(FlowLayout.LEFT));
//B p.setLayout(new GridLayout(2,2)); //dwa wiersze , dwie kolumny
p.setLayout(new BorderLayout());
JButton [] bb = new JButton[3];
bb[0] = new JButton("Tak");
bb[1] = new JButton("Nie");
bb[2] = new JButton("Nie odpowiem");
//dla A i B for(int i = 0; i <=2; i++) p.add(bb[i]);
// poniższe dla C
p.add("North",bb[0]);
p.add("East",bb[1]);
p.add("West",bb[2]);
p.add("West",new JButton("WEST"));
p.add("South",new JButton("South"));
p.add("Center",new JButton("center"));
}}
120
JAVA – Aplety, szablony rozmieszczenia
import java.awt.*; import java.util.*;
import javax.swing.*;
public class A11 extends javax.swing.JApplet {
public void init(){
Container p = getContentPane();
CardLayout cl = new CardLayout();
p.setLayout(cl);
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
jp1.setLayout(new FlowLayout(FlowLayout.LEFT));
jp2.setLayout(new FlowLayout(FlowLayout.RIGHT));
JButton [] bb = new JButton [] {new JButton("Tak"),new JButton("Nie"),new JButton("Nie odpowiem")};
for(int i = 0; i <=2; i++){
jp1.add(bb[i]); jp2.add(bb[i]);}
Istnieje jeszcze szablon GridBagLayout który jest rozszerzeniem
GridLayout
p.add("pierwsza",jp1);
p.add("druga" ,jp2);
cl.show(p,"druga");
//konieczna do wyświetlenia danej karty
}
}
121
JAVA – Aplety, obsługa zdarzeń
Zarządcy zdarzeń:
ActionListener – obsługuje zdarzenia generowane na rzecz danego składnika, np..kliknięcie przycisku,
AdjustmentListener – dla zdarzeń generowanych w momencie zmiany stanu składnika (np. przesunięcie suwaka pola ),
FocusListener – dla zdarzeń generowanych w powiązaniu ze zmianą aktywne – nieaktywne,
ItemListener – dla zdarzeń związanych z zaznaczaniem pola wyboru,
KeyListener – dla zdarzeń związanych z wejściem z klawiatury,
MouseListener – dla zdarzeń generowanych przez myszkę, kliknięcie, opuszczenie pola
MouseMotionListener – dla zdarzeń generowanych w czasie przesuwania myszki nad składnikami,
WindowListener – dla zdarzeń generowanych przez okno, np.. maksymalizacja okna.
Wiązanie składnika z zarządcą:
addActionListener(), np.dla JButton, JCheckBox, JComboBox, JTExtField, JRadioButton,
addAdjustmentListener(), dla JScrollBar,
addFocusListener(), dla wszystkich składników pakietu Swing,
addItemListener(), dla składników JButton, JCheckBox, JComboBox, JRadioButton,
addKeyListener(), dla wszystkich składników pakietu Swing,
addMouseListener(), dla wszystkich składników pakietu Swing,
addMouseMotionListener(), dla wszystkich składników pakietu Swing,
addWindowListener() – dla obiektów JWindow i JFrame.
122
JAVA – Aplety, obsługa zdarzeń
import java.awt.*; import java.awt.event.*; import javax.swing.*;
class ReAction implements ActionListener{
public class A12 extends javax.swing.JApplet {
JLabel jl,title;
JButton [] bb;
public void init(){
Container p = getContentPane();
p.setLayout(new FlowLayout());
title = new JLabel("Wybierz swój ulubiony język programowania");
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton)
jl.setText("Mój faworyt to:
"+((JButton)e.getSource()).getText());
repaint();
}
}//koniec wewnętrznej
}
bb = new JButton [] {new JButton("Pascal"),new JButton("Java"),new JButton("C++")};
jl = new JLabel(" ");
p.add(title);
for(int i = 0; i <=2; i++) {
p.add(bb[i]);
bb[i].addActionListener(new ReAction()); //ustawienie przechwytywania zdarzeń
}
p.add(jl);
}
123
JAVA – Aplety, obsługa zdarzeń
import java.awt.*; import java.awt.event.*; import javax.swing.*;
for(int i = 0; i < tab.length; i++){
tab[i].addItemListener(ra);
public class A13 extends javax.swing.JApplet {
tabG.add(tab[i]); //dodanie do grupy
private JTextField t = new JTextField(20);
p.add(tab[i]);
// dodanie do kontenera
}
public void init(){
p.add(ocena);
Container p = getContentPane();
p.add(t);
p.setLayout(new FlowLayout());
//pola wyboru zostaną zgrupowane, tylko jeden może być wybrany }
class ReAction implements ItemListener{
ButtonGroup tabG = new ButtonGroup();
private String cname;
JRadioButton [] tab = new JRadioButton [3];
private String state;
tab[0] = new JRadioButton("Kowalski");
public void itemStateChanged(ItemEvent e){
tab[1] = new JRadioButton("Nowak",true);
if (e.getSource() instanceof JRadioButton) {
tab[2] = new JRadioButton("Anonymus");
cname = ((JRadioButton)e.getSource()).getText();
t.setText(cname + state );
ReAction ra = new ReAction();
}
else {
JComboBox ocena = new JComboBox();
state = (String)e.getItem();
for(int i = 2; i<=5;i++) {
t.setText(cname + state);
ocena.addItem(""+i);
}
ocena.addItemListener(ra);
repaint();
}
}
124
}}
JAVA - Aplety
import java.awt.*; import java.awt.event.*;
import javax.swing.*;
public class A14 extends javax.swing.JApplet {
int x,y;
public void init(){
Container p = getContentPane();
JPanel panel = new JPanel();
ReAction ra = new ReAction();
panel.addMouseListener(ra);
p.add(panel);
}
public void paint(Graphics oknoAppletu) {
Graphics2D okno = (Graphics2D)oknoAppletu;
okno.drawString("tutaj", x, y);
class ReAction implements MouseListener{
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){
if (e.getClickCount()==2){
x = e.getX();
y = e.getY();
repaint();
}
}
}
}
125
JAVA – Aplety, zdarzenia
public class A15 extends javax.swing.JApplet {
int licznik = 0;
JTextField pole = new JTextField(10);
public void init(){
Container p = getContentPane();
p.add(pole);
JFrame ramka1 = new JFrame("Ramka1");
JButton p1 = new JButton("pierwszy");
ReAction a = new ReAction();
ramka1.setSize(150,150);
ramka1.addWindowListener(a);
ramka1.getContentPane().add(p1);
ramka1.setVisible(true);
class ReAction implements WindowListener{
public void windowOpened(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){
licznik++; repaint();
}
public void windowDeactivated(WindowEvent e){
repaint(); }
public void windowClosing(WindowEvent e){}
}
}
}
public void paint(Graphics oknoAppletu) {
Graphics2D okno = (Graphics2D)oknoAppletu;
pole.setText(Integer.toString(licznik));
}
126
JAVA – biblioteka net, identyfikacja
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*;
public class Pn1 {
private static JFrame ramka = new JFrame("Ramka");
private static JButton ident = new JButton("Wywolaj identyfikacje");
private static JTextField adrIP = new JTextField(30);
public static void main(String [] arg){
class Reaction implements ActionListener{
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton) { try {
InetAddress adres = InetAddress.getByName("skrzat");
adrIP.setText(adres.toString());
} catch (Exception E) {}
} } }//wewnętrzna
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.getContentPane().setLayout(new FlowLayout());
ramka.getContentPane().add(ident);
ramka.getContentPane().add(adrIP);
ramka.setSize(500,100);
ramka.setVisible(true);
ident.addActionListener(new Reaction());
}}
//skrzat to nazwa mojego lapt
Inne sposoby pozyskania lokalnego adresu IP:
InetAddress.getByName(null);
InetAddress.getByName ("localhost");
InetAddress.getByName ("127.0.0.1");
127
JAVA – Aplety, adres URL
import javax.swing.*; import java.net.*;
public class A16 extends javax.swing.JApplet {
JButton ident = new JButton("Jestem z .....");
JTextField adres = new JTextField(20);
class Reaction implements ActionListener{
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton)
{
URL adrU = getCodeBase();
// adres URL foldera z plikiem A16.class
adres.setText(adrU.toString());
}
}
}
public void init(){
Metoda getDocumentBase() zwraca adres URL
Container p = getContentPane();
reprezentujący stronę WWW która załadowała aplet
p.setLayout(new FlowLayout());
p.add(ident);
p.add(adres);
ident.addActionListener(new Reaction());
}
}
128
JAVA – Aplety, otwarcie adresu URL
import java.awt.*; import java.awt.event.*; import javax.swing.*;
import java.net.*;
public class A17 extends javax.swing.JApplet {
JButton b = new JButton("laduj z lokalnego");
JTextField t = new JTextField(20);
class Reaction implements ActionListener{
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton)
{
URL adres = getDocumentBase();
// z bieżącej lokalizacji
getAppletContext().showDocument(adres,"_blank"); // otwórz w nowym oknie przeglądarki
//
getAppletContext().showDocument(adres);
// w tym samym oknie
}
}
}
public void init(){
Container p = getContentPane();
p.setLayout(new FlowLayout());
p.add(b);
b.addActionListener(new Reaction());
}}
129
JAVA – połączenia poprzez adresy URL
public class A18 extends javax.swing.JApplet {
JButton b = new JButton("Polacz z WWW");
JTextField t1 = new JTextField();
JTextField t2 = new JTextField("------",15);
JLabel l1 = new JLabel(" Biezacy serwer WWW:");
JLabel l2 = new JLabel(" Polacz mnie z:");
JPanel [] tjp = new JPanel [2] ;
public void init(){
for(int i = 0; i < tjp.length; i++) tjp[i] = new JPanel();
Container p = getContentPane();
p.setLayout(new BorderLayout());
tjp[0].setLayout(new FlowLayout());
tjp[0].add(l1); tjp[0].add(t1); tjp[0].add(l2);
class Reaction implements ActionListener{
tjp[0].add(t2); tjp[1].add(b);
public void actionPerformed(ActionEvent e){
p.add("Center",tjp[0]);
if (e.getSource() instanceof JButton) {
p.add("South",tjp[1]);
try {
// określona lokalizacja
URL adres = new URL(t2.getText());
getAppletContext().showDocument(adres);
} catch (MalformedURLException ex) {
JOptionPane.showMessageDialog(null,"Error URL"); }
}}
t1.setText(getDocumentBase().toString());
b.addActionListener(new Reaction());
}
}
}
130
JAVA – połączenia poprzez adresy URL
public class Pn2 implements ActionListener {
private JFrame r = new JFrame("Autoryzacja dostępu");
private JButton ident = new JButton(”wywołaj identyfikacje");
private JTextField haslo = new JTextField(20);
private URL adres;
private JTextArea obszarT = new JTextArea(20,20);
BufferedReader czytaj;
String line = new String();
int nr = 102;
(bazowy kod jest zna następnej folii )
public static void main(String [] arg){
Pn2 ap = new Pn2();
ap.r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ap.r.getContentPane().setLayout(new FlowLayout());
ap.r.getContentPane().add(ap.haslo);
ap.r.getContentPane().add(ap.ident);
ap.r.getContentPane().add(ap.obszarTekstu);
ap.r.setSize(500,300);
ap.r.setVisible(true);
ap.ident.addActionListener(ap);
}
}
131
JAVA – połączenia poprzez adresy URL
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton)
{
try{
if ( Integer.parseInt(haslo.getText())!=nr) throw new Exception();
else {
adres = new URL("file:/c:/plik.txt");
// może to być też np. ftp://ath.bielsko.pl
// czy też www://ath.bielsko/pl
try{
obszarT.setText("start połączenia");
URLConnection poloczenie = adres.openConnection();
poloczenie.connect();
StringBuffer buf = new StringBuffer();
czytaj = new BufferedReader(new InputStreamReader(poloczenie.getInputStream()));
while ((line = czytaj.readLine())!=null) buf.append(line+'\n');
obszarTekstu.setText(buf.toString());
} catch (IOException E) {
JOptionPane.showMessageDialog(null,"Error in connection"); }
}
} catch (MalformedURLException ex) {
JOptionPane.showMessageDialog(null,"Error URL"); }
catch (Exception E) {
JOptionPane.showMessageDialog(null,"Error password"); }
}}
132
JAVA – połączenia poprzez adresy URL
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton)
{
try{
if ( Integer.parseInt(haslo.getText())!=nr) throw new Exception();
else {
adres = new URL("file:/c:/plik.txt");
try{
obszarT.setText("start połączenia");
StringBuffer buf = new StringBuffer();
czytaj = new BufferedReader(new InputStreamReader(adres.openStream()));
while ((line = czytaj.readLine())!=null) buf.append(line+'\n');
obszarTekstu.setText(buf.toString());
} catch (IOException E) {
JOptionPane.showMessageDialog(null,"Error in connection"); }
}
} catch (MalformedURLException ex) {
JOptionPane.showMessageDialog(null,"Error URL"); }
catch (Exception E) {
JOptionPane.showMessageDialog(null,"Error password"); }
}}
133
JAVA – połączenia poprzez adresy URL
class ConButton extends Button {
static int licznik = 0;
public int nr ;
ConButton(String n) { super(n); nr = licznik++;}
}
public class Pn4 implements ActionListener {
static ConButton b1 = new ConButton("Action READ I ");
static ConButton b2 = new ConButton("Action READ II");
static JTextArea tx = new JTextArea(10,10);
static JLabel et = new JLabel("File to read I / II ?");
static JTextField n = new JTextField(15);
static JScrollPane js = new JScrollPane(tx);
static JFrame ramka = new JFrame("Obsluga strumieni");
public static void main(String [] arg)
{
Pn4 apl = new Pn4();
apl.ramka.getContentPane().setLayout(new FlowLayout());
apl.ramka.getContentPane().add(b1);
apl.ramka.getContentPane().add(b2);
apl.ramka.getContentPane().add(et);
apl.ramka.getContentPane().add(n);
apl.ramka.getContentPane().add(tx);
apl.b1.addActionListener(apl);
apl.b2.addActionListener(apl);
apl.ramka.setSize(500,500);
apl.ramka.setVisible(true);
apl.ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
134
JAVA – połączenia poprzez adresy URL
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof ConButton)
{
if ( ((ConButton)e.getSource()).nr == 0 ) {
try {
String line = new String();
URL adres = new URL(n.getText());
try{
BufferedReader czytaj = new BufferedReader(new InputStreamReader(adres.openStream()));
while ((line = czytaj.readLine())!=null) tx.append(line+'\n'); //dopisuje
}
catch (IOException E) {JOptionPane.showMessageDialog(null,"Error in FILE connection"); }
}
catch (MalformedURLException ex) { JOptionPane.showMessageDialog(null,"Error URL"); }
}else
{
try {
String line = new String();
URL adres = new URL(n.getText());
URLConnection polaczenie = adres.openConnection();
polaczenie.connect();
try{
BufferedReader czytaj = new BufferedReader(new InputStreamReader(polaczenie.getInputStream()));
while ((line = czytaj.readLine())!=null) tx.append(line+'\n'); //dopisuje
}
catch (IOException E) { JOptionPane.showMessageDialog(null,"Error in FILE connection"); }
}
catch (MalformedURLException ex) {JOptionPane.showMessageDialog(null,"Error URL"); }
catch (IOException E) { JOptionPane.showMessageDialog(null,"Error in URLconnection"); }
} // dodatkowo IOException dla URLConnection
}}}
135
JAVA – Aplety i połączenia poprzez adresy URL
public class A19 extends javax.swing.JApplet {
private static JFrame ramka = new JFrame("Autoryzacja dostepu");
private static JButton ident = new JButton("Wywolaj identyfikacje");
private static JTextField haslo = new JTextField(20);
private static String wzor = new String("JAVA");
private static URL adres;
private static JTextArea obszarTekstu = new JTextArea(20,20);
private static BufferedReader czytaj;
private static String line = new String();
private static Pn2 aplikacja;
int nr = 102;
public static void run(){
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.getContentPane().setLayout(new FlowLayout());
ramka.getContentPane().add(haslo);
ramka.getContentPane().add(ident);
ramka.getContentPane().add(obszarTekstu);
ramka.setSize(500,300);
ramka.setVisible(true);
ident.addActionListener(aplikacja);
}
Aplety mogą komunikować się
wyłącznie z hostem z którego zostały
załadowane!!
public void init()
{
aplikacja = new Pn2();
run();
}
class PException extends Exception {
PException() { super();}
}
136
JAVA –adresy URL
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton) {
Aplety mogą komunikować się
try{
wyłącznie z hostem z którego zostały
załadowane!!
if ( Integer.parseInt(haslo.getText())!=nr) throw new PException();
else {
adres = new URL(getCodeBase(),"A9.java"); // punkt startowy to adres URL ==getCodeBase()
try{
obszarTekstu.setText("\n"+adres);
StringBuffer buf = new StringBuffer();
czytaj = new BufferedReader(new InputStreamReader(adres.openStream()));
while ((line = czytaj.readLine())!=null) buf.append(line+'\n');
obszarTekstu.setText(buf.toString());
}
catch (IOException E) {
JOptionPane.showMessageDialog(null,"Error in connection"); }
}
}catch (MalformedURLException ex) {
JOptionPane.showMessageDialog(null,"Error URL"); }
catch (PException E) {
JOptionPane.showMessageDialog(null,"Error password"); }
}}
137
JAVA – gniazda
import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
Socket gniazdo = new Socket(nazwa hosta , nr portu );
gniazdo.getInputStream()
gniazdo.getOutputStream()
public class Pn5 implements ActionListener {
Gniazdo.close()
static JButton b = new JButton(" search FINGER info");
static JTextField n = new JTextField(15);
static JFrame ramka = new JFrame("Obsluga strumieni");
public static void main(String [] arg)
{
Pn5 apl = new Pn5();
apl.ramka.getContentPane().setLayout(new FlowLayout());
apl.ramka.getContentPane().add(b);
apl.ramka.getContentPane().add(et);
apl.ramka.getContentPane().add(n);
apl.n.setText("[email protected]");
// plik .plan
Porty 1 – 1024 zarezerwowane są na usługi systemowe !!
(Assigned Numbers Authority)
Można używać dla swoich celów portów o numerach
większych niż 1024 i mniejszych od 65535.
Niektóre wyższe numery portów są wykorzystywane->
apl.b.addActionListener(apl);
apl.ramka.setSize(500,500);
apl.ramka.setVisible(true);
www.sockets.com/services.htm
apl.ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
138
JAVA –gniazda
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof JButton)
{
String line = new String();
String host = new String();
String user = new String();
StringTokenizer data = new StringTokenizer(n.getText(),"@");
Integer port = new Integer(79); //port zarezerwowany dla uslufi FINGER
user = data.nextToken();
host = data.nextToken();
try{
Socket gniazdo = new Socket(host,port.intValue());
PrintStream wyslij = new PrintStream(gniazdo.getOutputStream());
wyslij.print(user+"\015\012");
//protokół FINGER wymaga znaków karetki i wysunięcia na końcu!
BufferedReader odbierz = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
while ((line = odbierz.readLine())!=null) System.out.println(line);
gniazdo.close();
}
catch (IOException E) {JOptionPane.showMessageDialog(null,"Error in FILE connection"); }
}}}
139
JAVA – gniazda, serwery
public class Pn6 {
public static int port = 1995;
public static void main(String [] arg) {
try {
ServerSocket gniazdoS = new ServerSocket(port);
System.out.println(" Serwer " + gniazdoS + "już pracuje..."); //informacje gniazda serwera i nr portu
try {
Socket gniazdo = gniazdoS.accept(); //blokowanie pracy aż do nadejścia połączenia
try {
System.out.println(" Połączenie nastąpiło z klientem " + gniazdo); //adres IP klienta i nr portu
BufferedReader czytaj = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
PrintWriter pisz = new PrintWriter(new BufferedWriter(new OutputStreamWriter(gniazdo.getOutputStream())),true);
// true jako 2 parametr określa automatyczne opróżnianie bufora po każdym println
String line = new String();
while(true) {
line = czytaj.readLine();
pisz.println(line); System.out.println(line); // odsyła ten sam tekst aż do wystąpienia "logout"
if (line.equals("logout")) break;
}
} catch (IOException e) {System.err.println("wystapil blad klasy IO");}
}
catch (IOException e) {System.err.println("wystapil blad klasy IO");}
finally {
gniazdoS.close();
System.out.println("koniec pracy");}
}
catch (IOException e) {System.err.println("Nie można ustanowić serwera");}
140
}}
JAVA – gniazda, klienci
public class Pn7 {
public static int port = 1995;
public static void main(String [] arg) {
try {
InetAddress adres = InetAddress.getByName(null);
Socket gniazdo = new Socket(adres,port);
// uzyskujemy adres lokalny
System.out.println(" Serwer " + gniazdo + "juz pracuje...");
try {
System.out.println(" jest gniazdo " + gniazdo);
BufferedReader czytaj = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
PrintWriter pisz = new PrintWriter(new BufferedWriter(new OutputStreamWriter(gniazdo.getOutputStream())),true);
String line = new String();
BufferedReader wejscie = new BufferedReader(new InputStreamReader(System.in));
while(true) {
line = wejscie.readLine();
// co przeczyta z klawiatury to wysyła do serwera
pisz.println(line);
line = czytaj.readLine();
System.out.println("server :" + line); //odpowiedzi serwera na konsole
if (line.equals("logout")) break;
}
}
catch (IOException e) {System.err.println("wystąpił błąd klasy IO");}
finally {
gniazdo.close();
System.out.println("koniec pracy");}
}
catch (IOException e) {System.err.println("Nie można ustanowić serwera");}
}}
141