PO Graficzny interfejs użytkownika - ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jsroka (dyskusja | edycje)
 
(Nie pokazano 13 wersji utworzonych przez 4 użytkowników)
Linia 1: Linia 1:
{{powrot|Programowanie obiektowe|}}
{{powrot|Programowanie obiektowe|do przedmiotu Programowanie obiektowe}}


{{powrot|PO Moduł 14|do modułu 14}}
{{powrot|PO Graficzny interfejs użytkownika|do wykładu Graficzny interfejs użytkownika}}


== Zadanie 1 ==
== Zadanie 1 ==
Linia 13: Linia 13:
|}
|}


{{rozwiazanie| kod ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' javax.swing.*;
  '''import''' javax.swing.*;
   
   
Linia 44: Linia 46:
  }
  }
</div>
</div>
</div>}}
</div>


{{rozwiazanie| wyjaśnienie ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Widoczna będzie tylko etykieta dodana jako ostatnie, gdyż w każdym rejonie (bezparametrowa metoda ''add()'' dodaje komponenty po środku) może znajdować się tylko jeden komponent. Kolejne dodawane komponenty zastępują poprzednie.
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie wyjaśnienie</span>
<div class="mw-collapsible-content" style="display:none">
Widoczna będzie tylko etykieta dodana jako ostatnia, gdyż w każdym rejonie (bezparametrowa metoda ''add()'' dodaje komponenty po środku) może znajdować się tylko jeden komponent. Kolejne dodawane komponenty zastępują poprzednie.
</div>
</div>
</div>
</div>}}


== Zadanie 2 ==
== Zadanie 2 ==
Zmodyfikuj klasę ''GridLayoutTest'', tak aby to trzecia pozycja w siatce (tam gdzie jest przycisk ''P3''), a nie szósta była pusta.
Zmodyfikuj klasę ''GridLayoutTest'', tak aby to trzecia (tam gdzie jest przycisk ''P3''), a nie szósta pozycja w siatce była pusta.


{| border="1"
{| border="1"
Linia 61: Linia 65:
|}
|}


{{rozwiazanie| kod ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.awt.*;
  '''import''' java.awt.*;
  '''import''' javax.swing.*;
  '''import''' javax.swing.*;
Linia 91: Linia 97:
  }
  }
</div>
</div>
</div>}}
</div>


== Zadanie 3 ==
== Zadanie 3 ==
Wyświetl okno o rozmiarach 300 na 150, zawierające na górze pięć przycisków: ''P1'', ''P2'', ''P3'', ''P4'' i ''Bardzo długi przycisk'' rozmieszczonych przez ''GridLayout'' o dwóch wierszach i trzech kolumnach, a na dole takie same pięć przycisków rozmieszczonych przy pomocy ''FlowLayout''. Grupy przycisków powinny być rozmieszczone na oknie przez ''BorderLayout''. Sprawdź czy wszystkie przyciski mieszczą się w oknie o tych rozmiarach.
Wyświetl okno o rozmiarach 300 na 150, zawierające na górze pięć przycisków: ''P1'', ''P2'', ''P3'', ''P4'' i ''Bardzo długi przycisk'' rozmieszczonych przez ''GridLayout'' o dwóch wierszach i trzech kolumnach, a na dole takie same pięć przycisków rozmieszczonych przy pomocy ''FlowLayout''. Grupy przycisków powinny być rozmieszczone na oknie przez ''BorderLayout''. Sprawdź, czy wszystkie przyciski mieszczą się w oknie o tych rozmiarach.


{| border="1"
{| border="1"
Linia 102: Linia 108:
| Żeby uruchomić przykład [[media:PO_GUI_Zad3.jar|Po_GUI_Zad3.jar]] ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. || <applet code="applet.Zad3Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>
| Żeby uruchomić przykład [[media:PO_GUI_Zad3.jar|Po_GUI_Zad3.jar]] ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. || <applet code="applet.Zad3Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>
|}
|}
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| kod ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.awt.*;
  '''import''' java.awt.*;
  '''import''' javax.swing.*;
  '''import''' javax.swing.*;
Linia 148: Linia 155:
  }
  }
</div>
</div>
</div>}}
</div>


== Zadanie 4 ==
== Zadanie 4 ==
Linia 159: Linia 166:
| Żeby uruchomić przykład [[media:PO_GUI_Zad4.jar|Po_GUI_Zad4.jar]] ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. || <applet code="applet.Zad4Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>
| Żeby uruchomić przykład [[media:PO_GUI_Zad4.jar|Po_GUI_Zad4.jar]] ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. || <applet code="applet.Zad4Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>
|}
|}
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{wskazowka| 1 ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span>
<div class="mw-collapsible-content" style="display:none">
Jako pierwszy parametr konstruktora trzeba przekazać obiekt ''ContentPane'', a nie kontener. Obiekt ''ContentPane'' dla danego kontenera uzyskuje się przy pomocy metody ''getContentPane()''.
Jako pierwszy parametr konstruktora trzeba przekazać obiekt ''ContentPane'', a nie kontener. Obiekt ''ContentPane'' dla danego kontenera uzyskuje się przy pomocy metody ''getContentPane()''.
</div>
</div>
</div>}}
</div>


{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span>
<div class="mw-collapsible-content" style="display:none">
''BoxLayout'' respektuje sposób wyśrodkowania preferowany przez komponenty. Do zmiany preferowanego wyśrodkowania komponentu służy metoda ''setAlignmentX(Component.CENTER_ALIGNMENT)''.
''BoxLayout'' respektuje sposób wyśrodkowania preferowany przez komponenty. Do zmiany preferowanego wyśrodkowania komponentu służy metoda ''setAlignmentX(Component.CENTER_ALIGNMENT)''.
</div>
</div>
</div>}}
</div>


{{rozwiazanie| kod ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.awt.*;
  '''import''' java.awt.*;
  '''import''' javax.swing.*;
  '''import''' javax.swing.*;
Linia 215: Linia 227:
  }
  }
</div>
</div>
</div>}}
</div>


== Zadanie 5 ==
== Zadanie 5 ==
Linia 227: Linia 239:
|}
|}


{{wskazowka | 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span>
<div class="mw-collapsible-content" style="display:none">
Dodaj do przycisków ''MouseListener'', a kod zamieniający kartki umieść w metodzie ''mouseEntered(MouseEvent)''
Dodaj do przycisków ''MouseListener'', a kod zamieniający kartki umieść w metodzie ''mouseEntered(MouseEvent)''
</div>
</div>
</div>}}
</div>


{{wskazowka | 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Jeżeli używasz ''CardLayout'' w głównym kontenerze, jako parametr ''parent'' metod first()'', ''last()'', ''next()'' i ''previous()'' przekazuj przekazuj kontener uzyskany z głównego kontenera przy pomocy metody ''getContentPane()'', a nie sam główny kontener.
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span>
<div class="mw-collapsible-content" style="display:none">
Jeżeli używasz ''CardLayout'' w głównym kontenerze, jako parametr ''parent'' metod first()'', ''last()'', ''next()'' i ''previous()'' przekazuj kontener uzyskany z głównego kontenera przy pomocy metody ''getContentPane()'', a nie sam główny kontener.
</div>
</div>
</div>
</div>}}


{{rozwiazanie| kod ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.awt.*;
  '''import''' java.awt.*;
  '''import''' java.awt.event.*;
  '''import''' java.awt.event.*;
Linia 251: Linia 269:
   '''class''' ZamianaKart '''extends''' MouseAdapter {
   '''class''' ZamianaKart '''extends''' MouseAdapter {
     '''public''' '''void''' mouseEntered(MouseEvent e) {
     '''public''' '''void''' mouseEntered(MouseEvent e) {
       //jeżeli używasz CardLayout w głównym kontenerze,
       //jeżeli używasz CardLayout w głównym kontenerze, to metodom oczekującym parametru
       //metodą oczekującym "the parent container in which to do the layout"
       //opisanego w dokumentacji jako "the parent container in which to do the layout"
       //przekazuj kontener uzyskany z głównego kontenera przy pomocy metody getContentPane(),
       //przekazuj kontener uzyskany z głównego kontenera przy pomocy metody getContentPane(),
       //a nie sam główny kontener
       //a nie sam główny kontener
Linia 296: Linia 314:
  }
  }
</div>
</div>
</div>}}
</div>


== Zadanie 6 ==
== Zadanie 6 ==
Rozszerz klasę ''Dodawanie'' o możliwość zmiany działania na mnożenie. Niech wybór działania będzie możliwy przy pomocy przycisku combo (''JComboBox''). Niech wynik będzie obliczany zarówno, gdy zostanie zaakceptowana wartość, z któregoś z pól oraz gdy zostanie zmienione działanie. Niech zawartość pól tekstowych będzie wyśrodkowana do prawej.
Rozszerz klasę ''Dodawanie'' o możliwość zmiany działania na mnożenie. Niech wybór działania będzie możliwy przy pomocy przycisku combo (''JComboBox''). Niech wynik będzie obliczany zarówno gdy zostanie zaakceptowana wartość z któregoś z pól, oraz gdy zostanie zmienione działanie. Niech zawartość pól tekstowych będzie wyśrodkowana do prawej.


{| border="1"
{| border="1"
Linia 308: Linia 326:
|}
|}


{{rozwiazanie| kod ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.awt.*;
  '''import''' java.awt.*;
  '''import''' java.awt.event.*;
  '''import''' java.awt.event.*;
Linia 336: Linia 356:
    
    
   //do obsługi zdarzeń często używane są anonimowe klasy wewnętrzne
   //do obsługi zdarzeń często używane są anonimowe klasy wewnętrzne
   //jeden egezmplarz będzie dzielony przez oba pola
   //jeden egzemplarz będzie dzielony przez oba pola
   ActionListener sumowanie = '''new''' ActionListener() {
   ActionListener sumowanie = '''new''' ActionListener() {
     '''public''' '''void''' actionPerformed(ActionEvent ev) {
     '''public''' '''void''' actionPerformed(ActionEvent ev) {
Linia 388: Linia 408:
  }
  }
</div>
</div>
</div>}}
</div>
 
== Zadanie 7 ==
Komponenty Swing wyświetlające tekst obsługują formatowanie HTML. Korzystając z tego udogodnienia, stwórz prostą aplikację wyświetlającą stronę HTML znajdującą się pod zadanym adresem URL. Do wyświetlania strony użyj obiektu ''JEditorPane''. Do odczytywania strony użyj obiektu ''java.net.URL''.
 
{| border="1"
|+ Podgląd działającego rozwiązania
! Archiwum JAR !! Applet
|-
| Żeby uruchomić przykład [[media:PO_GUI_Zad7.jar|Po_GUI_Zad7.jar]] ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. || <applet code="applet.Zad7Applet" archive="images/d/db/PO_GUI_Applety.jar" width="500" height="380"></applet>
|}
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span>
<div class="mw-collapsible-content" style="display:none">
Metoda ''setPage(URL)'' nie usuwa wszystkich informacji o poprzednio wyświetlanej stronie, np. definicji stylów. 
Aby pozbyć się wszystkich pozostałości należy utworzyć nowy dokument przy pomocy wywołania ''getEditorKit().createDefaultDocument()'' i przekazać go do metody ''setDocument()''.
</div>
</div>
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie kod</span>
<div class="mw-collapsible-content" style="display:none">
'''import''' java.awt.*;
'''import''' java.awt.event.*;
'''import''' javax.swing.*;
'''public''' '''class''' Zad7 '''extends''' JFrame {
  JEditorPane tekst = '''new''' JEditorPane();
  JTextField adres = '''new''' JTextField("http://www.google.pl");
  JButton przycisk = '''new''' JButton("Wczytaj stronę");
 
  Zad7() {
    '''super'''("Okno ZliczanieKliknięć");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
    ActionListener wczytajStronę = '''new''' ActionListener() {
      '''public''' '''void''' actionPerformed(ActionEvent ev) {
        java.net.URL url = '''null''';
        '''try''' {
          //poprzedni dokument mógł pozostawić style
          tekst.setDocument(tekst.getEditorKit().createDefaultDocument());         
          url = '''new''' java.net.URL(adres.getText());
          tekst.setPage(url);
        } '''catch''' (Exception e) {
          System.err.println("Błędny URL: " + url);
          tekst.setText("Błędny URL: " + url + "\n" + e.getMessage());
        }
      }
    };
   
    adres.addActionListener(wczytajStronę);
    przycisk.addActionListener(wczytajStronę);
   
    JScrollPane suwaki = '''new''' JScrollPane(tekst);
    add(suwaki);
    Box box = '''new''' Box(BoxLayout.X_AXIS);
    box.add(przycisk);
    box.add(Box.createHorizontalStrut(10));
    box.add(adres);
    add(BorderLayout.SOUTH, box);
   
    setSize(500,400);
    setVisible(true);
  }
 
  '''public''' '''static''' '''void''' main(String[] args) {
    //aby uniknąć zakleszczeń, tworzenie GUI zawsze zlecamy dla wątku obsługi zdarzeń
    javax.swing.SwingUtilities.invokeLater('''new''' Runnable() {
      '''public''' void run() {
        '''new''' Zad7();
      }
    });
  }
}
</div>
</div>

Aktualna wersja na dzień 21:42, 28 maj 2020

<<< Powrót do przedmiotu Programowanie obiektowe

<<< Powrót do wykładu Graficzny interfejs użytkownika

Zadanie 1

W klasie WitajŚwiecie umieść w oknie głównym drugą etykietę z tekstem. Użyj w tym celu bezparametrowej metody add(). Czemu obie etykiety nie są widoczne?

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad1.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad1Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>

Rozwiązanie kod

Rozwiązanie wyjaśnienie

Zadanie 2

Zmodyfikuj klasę GridLayoutTest, tak aby to trzecia (tam gdzie jest przycisk P3), a nie szósta pozycja w siatce była pusta.

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad2.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad2Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>

Rozwiązanie kod

Zadanie 3

Wyświetl okno o rozmiarach 300 na 150, zawierające na górze pięć przycisków: P1, P2, P3, P4 i Bardzo długi przycisk rozmieszczonych przez GridLayout o dwóch wierszach i trzech kolumnach, a na dole takie same pięć przycisków rozmieszczonych przy pomocy FlowLayout. Grupy przycisków powinny być rozmieszczone na oknie przez BorderLayout. Sprawdź, czy wszystkie przyciski mieszczą się w oknie o tych rozmiarach.

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad3.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad3Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>

Rozwiązanie kod

Zadanie 4

Używając BoxLayout i obiektów klasy Box przygotuj program wyświetlający 5 przycisków rozmieszczonych w dwóch kolumnach (w pierwszej trzy w drugiej dwa). Niech w każdej kolumnie przyciski będą wyśrodkowane. Porównaj efekt z przykładem GridLayoutTest.

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad4.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad4Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>

Wskazówka 1

Wskazówka 2

Rozwiązanie kod

Zadanie 5

Przygotuj program wyświetlający przycisk, który po najechaniu na niego myszką zmienia położenie. Do zmiany położenia użyj CardLayout.

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad5.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad5Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>

Wskazówka 1

Wskazówka 2

Rozwiązanie kod

Zadanie 6

Rozszerz klasę Dodawanie o możliwość zmiany działania na mnożenie. Niech wybór działania będzie możliwy przy pomocy przycisku combo (JComboBox). Niech wynik będzie obliczany zarówno gdy zostanie zaakceptowana wartość z któregoś z pól, oraz gdy zostanie zmienione działanie. Niech zawartość pól tekstowych będzie wyśrodkowana do prawej.

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad6.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad6Applet" archive="images/d/db/PO_GUI_Applety.jar" width="300" height="120"></applet>

Rozwiązanie kod

Zadanie 7

Komponenty Swing wyświetlające tekst obsługują formatowanie HTML. Korzystając z tego udogodnienia, stwórz prostą aplikację wyświetlającą stronę HTML znajdującą się pod zadanym adresem URL. Do wyświetlania strony użyj obiektu JEditorPane. Do odczytywania strony użyj obiektu java.net.URL.

Podgląd działającego rozwiązania
Archiwum JAR Applet
Żeby uruchomić przykład Po_GUI_Zad7.jar ściągnij najpierw archiwum jar na swój komputer (możesz to zrobić klikając na odnośniku prawym klawiszem myszy i wybierając "Zapisz jako...") i uruchom jak zwykły program. <applet code="applet.Zad7Applet" archive="images/d/db/PO_GUI_Applety.jar" width="500" height="380"></applet>

Wskazówka

Rozwiązanie kod