Swing ćwiczenia 2 opis Zad 1. a) Dołożyliśmy nowy obszar tekstowy JTextArea i w jego właściwości Document ustawiliśmy, że ma wspólny dokument (model-treść) z naszym pierwszym JTextArea. Zauważmy, że wpisując coś do pierwszego pola to samo pojawia się w drugim. Ale jak zrobimy zmianę czcionki w 1-szym, to zmienia się tylko widok. Natomiast załadowanie z pliku metoda write- tworzy nowy dokument. b) Potem oprogramowaliśmy zdarzenie akcji dla checkboxów - bold i italic. Warto sobie zmieniać nazwy tych kontrolek w programie (zakładka Code w properties danej kontrolki), bo potem ciężko pamiętać po numerach Stałe : BOLD- 1, ITALIC- 2 na różnych bitach: old_style Font.BOLD ustawi w starym stylu 1 na ostatnim bicie old_style Font.ITALIC - ustawi w starym stylu 1 na przedostatnim bicie
private void jmenuitemboldactionperformed(java.awt.event.actionevent evt) { int old_style = jtextarea1.getfont().getstyle();//stary styl //metoda derivefont- tworzy nowa czcionka jtextarea1.setfont(jtextarea1.getfont().derivefont(jmenuitembold.isse lected()? old_style Font.BOLD : old_style & ~Font.BOLD)); private void jmenuitemitalicactionperformed(java.awt.event.actionevent evt) { int old_style = jtextarea1.getfont().getstyle(); jtextarea1.setfont(jtextarea1.getfont().derivefont(jmenuitemitalic.is Selected()? old_style Font.ITALIC : old_style & ~Font.ITALIC)); c) Oprogramowaliśmy zdarzenie dla menuitem: Otwórz, Zapisz: Używamy JFileChooser. Pamiętajcie aby sami nie pisać try-catch tylko napisać : jtextarea1.write(new FileWriter(fch.getSelectedFile())); a NetBeans sam zaproponuje try-catch private void jmenuitemzapiszactionperformed(java.awt.event.actionevent evt) {
JFileChooser fch = new JFileChooser(); if (fch.showsavedialog(null) == JFileChooser.APPROVE_OPTION) { try { /* public void write(writer out) throws IOException Stores the contents of the model into the given stream. By default this will store the model as plain text. */ jtextarea1.write(new FileWriter(fch.getSelectedFile())); catch (IOException ex) { Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); private void jmenuitemotworzactionperformed(java.awt.event.actionevent evt) { JFileChooser fch = new JFileChooser(); if (fch.showopendialog(null) == JFileChooser.APPROVE_OPTION) { try { /* public void read(reader in, Object desc) throws IOException Initializes from a stream. This creates a model of the type appropriate for the component and initializes the model from the stream. By default this will load the model as plain text. Previous contents of the model are discarded. */ jtextarea1.read(new FileReader(fch.getSelectedFile()), null); catch (IOException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); Zad 2. Kalkulator można pisać samemu z palca, można korzystając z udogodnień NetBeans a) Tworzymy projekt (odznaczamy main()), dodajemy do default package nową formatkę (okno, ramkę) New JFrame, przy czym pamiętamy o dodaniu nazwy pakietu. (Dla zapominalskich stajemy potem na projekcie, dodajemy nowy pakiet i przeciągamy do niego nasza formatkę.) b) Ustawiamy w naszym JFrame rozkład brzegowy prawym przyciskiem mysz- menu podręczne- setlayout->borderlayout c) Na północy dodajemy przycisk d) To będzie nasz wyświetlacz. Text przycisku ustawiamy na 0 i justujemy do prawej horizontalaligment- RIGHT-, czynimy go nieaktywnym odznaczamy opcję enabled i nazywamy do display (zakładka Code): e) Poniżej przycisku dodajemy panel i ustawiamy na nim rozkład siatkowy GridLayout 4x4.
f) Dodajemy 16 przycisków i ustawiamy ich teksty jak na rysunku: g) Jeśli jest za mały to ustawcie rozmiar ramki na np. 500x600 h) Teraz powiększymy czcionkę na przyciskach, aby nie robić tego dla każdego przycisku to np.: Ustawmy czcionkę w oknie jframe, a potem zaznaczymy wszystkie przyciski (z Shift lub Ctrl) i ustawimy im wspólnie czcionkę jak w jframe: klikamy na własność Font.
i) W końcu możemy zacząć oprogramowywać nasz kalkulator. Zauważmy, że mamy dwa typy przycisków: cyferki i kropke, po których wciśnięciu mają się pojawić na przycisku display oraz przyciski operacji. Tu nam NetBeans trochę przeszkadza, bo nie pozwala pisać np. 2-ch typów wewnętrznych klas nasłuchujących, ale możemy użyć akcji. Akcje mają dużo większe możliwości niż zdarzenie- bo nie tylko mówią co robić w reakcji na zdarzenie ale i mogą ustawiać pewne właściwości (wykład), u nas nie ma takiej potrzeby, nam chodzi tylko o wspólna reakcję na zdarzenie: Dlatego najpierw kilka zmiennych, a potem nasze akcje: private double result = 0;//zmienna na wynik dzialania private String lastcommand = "="; private boolean start = true; /** * Ta akcja wstawia łańcuch akcji przycisku na końcu tekstu do wyświetlenia. */ private Action insertaction = new AbstractAction() { @Override public void actionperformed(actionevent e) { //pobieramy Tekst z przycisku String input = e.getactioncommand(); if (start) { //zaczynamy display.settext("");//nie było jeszcze zadnego tekstu start = false; else { //sparwdzamy czy ktos nie dadaje drugiej. if (".".equals(input) && display.gettext().contains(".")) {
return; //wówczas przerywamy tę akcję //pobieramy to co było i dostawiamy nowy znak display.settext(display.gettext() + input); ; /** * Ta akcja wykonuje polecenia określone przez akcję przycisku. */ private Action commandaction = new AbstractAction() { @Override public void actionperformed(actionevent e) { //pobieramy Tekst z przycisku String command = e.getactioncommand(); if (start) { //jesli zaczynamy to pierwszy oznacza liczbe ujemna //i musimy go wyświetlić na display if (command.equals("-")) { display.settext(command); start = false; else { //ktos na poczatku podal komende to nie robimy nic, // zapisujemy ja w lastcommand albo return; lastcommand = command; else {//bedziemy probowac liczyc wartosc //try-catch piszemy sami bo wyjątek wyrzucany //przez parsedouble nie jest kontrolowany //a może ktoś podać tylko. zamiast liczby try { //obliczamy przy pomocy metody pomocniczej calculate //dostaje ona ostatnio pobrana liczbe calculate(double.parsedouble(display.gettext())); lastcommand = command; start = true; catch (NumberFormatException exc) { ; /** * Wykonuje oczekujące działania. * * @param x wartość, która ma być połączona z poprzednim wynikiem.
*/ public void calculate(double x) { if (lastcommand.equals("+")) { result += x; else if (lastcommand.equals("-")) { result -= x; else if (lastcommand.equals("*")) { result *= x; else if (lastcommand.equals("/")) { result /= x; else if (lastcommand.equals("=")) { result = x; display.settext("" + result); Np.2+3= Najpierw podajemy 2, potem + Wchodzimy do calculate i lastcommand = "="; Zatem result =2, Po wykonaniu calculate dopiero : lastcommand = "+"; Potem podajemy 3 i = wtedy znow wchodzimy do calculate i lastcommand = "+"; Zatem do result=2 dodajemy 3 i wyświetlamy 5 A lastcommand = "="; Zatem kolejne obliczenia zaczna się od tej wartości j) Pozostało tylko przypisać akcje przyciskom: zaznaczamy pierwszą grupę i klikamy właściwość Action, wybieramy custom code i wpisujemy nazwę naszej akcji, to samo dla operacji (+-*/=) k) Można jeszcze się bawić w /0 i 0/0 u nas teraz mamy Infinity i NaN- bo zawsze robimy parsedouble i dzialmy na rzeczywistych (dla całkowitych rzucałoby wyjątkami)