Integralną częścią platformy Java jest biblioteka swing, za pomocą której można tworzyć aplikacje z zaawansowanym interfejsem graficznym. Poniżej znajdziesz instrukcję do ćwiczeń, które mają na celu zapoznanie z techniką tworzenia interfejsu graficznego oraz programowania obsługi zdarzeń związanych z interfejsem graficznym.
Poniżej znajdziesz przykład demonstrujący tworzenie prostego interfejsu graficznego oraz obsługę zdarzeń związanych z elementami tego interfejsu.
import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Demo implements ActionListener { JTextField t1; JButton b1; JButton b2; public void actionPerformed(ActionEvent e) { Object target = e.getSource(); if(target==b1||target==t1) { int k=Integer.parseInt(t1.getText()); t1.setText(Integer.toString(k*k)); t1.requestFocus(); } else if (target==b2) { t1.setText(""); t1.requestFocus(); } } void init() { t1=new JTextField(6); b1=new JButton("^2"); b2=new JButton("clear"); JPanel p=new JPanel(); p.add(t1); p.add(b1); p.add(b2); t1.addActionListener(this); b1.addActionListener(this); b2.addActionListener(this); JFrame f=new JFrame(); Container c=f.getContentPane(); c.add(p); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } public static void main(String[] args) { //do wersji 1.4 //new Demo().init(); //od wersji 1.5 SwingUtilities.invokeLater(new Runnable() { public void run() { new Demo().init(); } }); } }
ćw. 7.1
Dodaj odpowiednie pola oraz przyciski „+” i „=” i zaimplementuj operacje dodawania dwóch liczb. Dodaj obsługę sytuacji wyjątkowych, zwłaszcza wyjątku NumberFormatException.
Poniżej znajdziesz kod źródłowy szkieletu prostej implementacji kalkulatora. Przeanalizuj metody tworzenia elementów interfejsu graficznego, rozmieszczania tych elementów względem siebie (menadżer rozkładu) oraz programowania obsługi zdarzeń związanych z interfejsem graficznym.
import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Kalk implements ActionListener { JTextField t1; JButton b1; JButton bplus,brow; double x,buf; public void actionPerformed(ActionEvent e) { Object target = e.getSource(); if(target==b1) { t1.setText(t1.getText()+((JButton)target).getText()); t1.requestFocus(); } else if(target==bplus) { buf=Double.parseDouble(t1.getText()); t1.setText(""); t1.requestFocus(); } else if(target==brow||target==t1) { x=Double.parseDouble(t1.getText()); x=buf+x; t1.setText(Double.toString(x)); t1.requestFocus(); } } void init() { //try //{ //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); //} //catch(Exception e){} JFrame f=new JFrame(); Container c=f.getContentPane(); GridBagLayout gbl=new GridBagLayout(); GridBagConstraints gbc=new GridBagConstraints(); gbc.fill=GridBagConstraints.HORIZONTAL; c.setLayout(gbl); t1=new JTextField(15); t1.addActionListener(this); t1.setHorizontalAlignment(JTextField.RIGHT); gbc.gridx=0; gbc.gridy=0; gbc.gridwidth=5; gbc.ipadx=0; gbc.ipady=5; gbc.insets=new Insets(5,5,0,5); gbl.setConstraints(t1,gbc); c.add(t1); b1=new JButton("1"); b1.addActionListener(this); b1.setFocusable(false); gbc.gridx=0; gbc.gridy=1; gbc.gridwidth=1; gbc.ipadx=0; gbc.ipady=0; gbc.insets=new Insets(5,5,0,0); gbl.setConstraints(b1,gbc); c.add(b1); bplus=new JButton("+"); bplus.addActionListener(this); bplus.setFocusable(false); bplus.setToolTipText("dodawanie"); gbc.gridx=3; gbc.gridy=1; gbc.gridwidth=2; gbc.ipadx=30; gbc.ipady=0; gbc.insets=new Insets(5,5,0,5); gbl.setConstraints(bplus,gbc); c.add(bplus); brow=new JButton("="); brow.addActionListener(this); brow.setFocusable(false); brow.setToolTipText("wykonaj działanie"); gbc.gridx=0; gbc.gridy=5; gbc.gridwidth=4; gbc.ipadx=30; gbc.ipady=0; gbc.insets=new Insets(5,5,5,0); gbl.setConstraints(brow,gbc); c.add(brow); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setTitle("Kalk"); f.setVisible(true); } public static void main(String[] args) { //do wersji 1.4 //new Kalk().init(); //od wersji 1.5 SwingUtilities.invokeLater(new Runnable() { public void run() { new Kalk().init(); } }); } }
ćw. 7.2
Zestaw odpowiednią jednostkę kompilacji, a następnie skompiluj i przetestuj powyższy przykład. Następnie rozwiń go dodając pozostałe przyciski z cyframi oraz kropką dziesiętną i napisz odpowiednie funkcje obsługi zdarzeń (pamiętaj że w danej chwili na wyświetlaczu nie mogą się pojawić dwie kropki dziesiętne).
ćw. 7.3
Dodaj przyciski reprezentujące podstawowe operacje matematyczne, a także potęgowanie, pierwiastek kwadratowy, procenty oraz pamięć. Napisz odpowiednie funkcje obsługi przycisków oraz uwzględnij obsługę takich sytuacji jak dzielenie przez zero, czy pierwiastek z liczby ujemnej. Podstawowe funkcje matematyczne są zaimplementowane w bibliotece jako metody statyczne klasy java.lang.Math. Do konwersji pomiędzy liczbą zmiennopozycyjną (double) i tekstem (String) służą odpowiednie metody klasy opakowującej java.lang.Double.
ćw. 7.4
Dopracuj swój kalkulator w ten sposób żeby do wyświetlacza nie dawało się wprowadzać dowolnych znaków z klawiatury, a jedynie cyfry wprowadzane za pomocą przycisków interfejsu graficznego lub klawiszy cyfrowych z klawiatury. W tym celu stan pola tekstowego (wyświetlacz) ustaw na nieedytowalne (metoda: setEditable() klasy JTextField). Zdarzenia klawiatury możesz obsłużyć za pomocą interfejsu KeyListener.
ćw. 7.5
Dodaj rejestrację wszystkich działań wykonanych za pomocą kalkulatora oraz ich wyników do pliku tekstowego oraz zaimplementuj w kalkulatorze operacje cofania działań.
ćw. 1.6
Napisz interfejs graficzny do wielowątkowego komunikatora internetowego, który stanowił jedno z ćwiczeń które wykonaliśmy w poprzednim semestrze.
Poniżej znajdziesz przykład serializacji obiektu do strumienia szyfrowanego algorytmem symetrycznym DES. Przykład składa się z kilku etapów - generowanie klucza na podstawie hasła, zapis obiektu (w tym przypadku tekstu) do pliku i odczyt obiektu z pliku. Serializację wykorzystamy w kolejnym ćwiczeniu, polegającym na napisaniu implementacji pamiętnika, wyposażonego w interfejs graficzny stworzony w oparciu o javax.swing, który będzie zapisywał notatki do pliku szyfrowanego za pomocą hasła.
import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class DesTest { public static void main(String args[]) throws Exception { String msg="pozdrowienia od cioci"; String passwd="tajnehaslo"; byte[] b=passwd.getBytes(); //-- generowanie klucza -- System.out.println("tworzy generator kluczy"); KeyGenerator kgen = KeyGenerator.getInstance("DES"); kgen.init(new java.security.SecureRandom(b)); System.out.println("generuje klucz"); SecretKey key = kgen.generateKey(); //-- szyfrowanie -- System.out.println("tworzy obiekt klasy Cipher"); javax.crypto.Cipher c1 = javax.crypto.Cipher.getInstance("DES"); System.out.println("inicjuje cipher do szyfrowania"); c1.init(Cipher.ENCRYPT_MODE,key); ObjectOutputStream out; out=new ObjectOutputStream(new CipherOutputStream(new FileOutputStream("plik.txt"),c1)); out.writeObject(msg); out.flush(); out.close(); //-- deszyfrowanie -- System.out.println("tworzy obiekt klasy Cipher"); javax.crypto.Cipher c2 = javax.crypto.Cipher.getInstance("DES"); System.out.println("inicjuje cipher do deszyfrowania"); c2.init(Cipher.DECRYPT_MODE,key); ObjectInputStream in; in=new ObjectInputStream(new CipherInputStream(new FileInputStream("plik.txt"),c2)); String str=(String)in.readObject(); in.close(); System.out.println("\n-- "+str+" --\n"); } }
ćw. 7.7
Napisz implementację elektronicznego pamiętnika, którego treść jest zapisywana do pliku w postaci zaszyfrowanej za pomocą algorytmu DES. Rozpocznij od najprostszego pamiętnika zapisującego tekst do pliku, a następnie rozwiń go o takie możliwości jak automatyczne datowanie wpisów, system zakładek z kolejnymi wpisami, pełnotekstową wyszukiwarkę i system dodawania zdjęć do notatek.
Z. Dendzik, 2024