Obraz zawierający tekst, Czcionka, Grafika

Opis wygenerowany automatycznie 

Kierunek Informatyka

 

Instrukcja do ćwiczeń laboratoryjnych nr:

9

Nazwa przedmiotu:
Programowanie w języku Java

Temat:  Swing – komponenty graficzne, programowanie zdarzeniowe. Siatki rozmieszczenia obiektów w interfejsie graficznym, menu, toolbar

Tryb studiów: stacjonarne

Czas trwanie ćw.

2x45 min

Autor materiałów: dr Marcin Skuba

 

1. Treści programowe:

Biblioteka JFC/Swing, okna dialogowe, komponenty graficzne (JMenu, JMenuBar, MenuItem) pasek narzędziowy, funkcje wyboru (pojedynczego i wielokrotnego).

 

2. Cel zajęć:

Opanowanie umiejętności programowania z typowymi dla aplikacji elementami, jak menu, paski narzędziowe oraz okna dialogowe. Doskonalenie w posługiwaniu się interfejsem do obsługi zdarzeń związanych z akcją. 

 

3. Pomoce dydaktyczne:

Klasy menu pakietu SWING:

JMenuBar – główna belka menu,

JMenu -  rozwijane element menu,

JMenuItem – pojedynczy element rozwijanego menu.

 

            JRadioButton - klasa definiująca obiekt wyboru,

            ButtonGroup - klasa grupująca obiekty wyboru,

           

            JToolBar - pasek narzędziowy.

 

Do obsługi zdarzeń związanych z kliknięciem na pozycje menu oraz opcje wyboru należy wykorzystać interfejs: ActionListener.

 

PRZYKŁAD 1.

 

Każda grafika oraz inne pliki zasobów powinny znajdować się w odpowiednich folderach w celu lepszej organizacji danych i porządku w projekcie.

Aby stworzyć nowy folder należy wybrać:

 

 

 

 

 

 

Aby pliki zasobów były dostępne w programie musimy zmienić zwykły folder na -> Resources Root

 

 

Pliki graficzne możemy umieścić w folderze grafika metodą kopiuj – wklej.

Link do strony z przykładowymi ikonami: http://www.iconarchive.com/commercialfree.html

 

Poniżej przedstawiono program, gdzie główny panel został wyposażony w siatkę rozmieszczenia BorderLayout, który to pozwala dzielić panel na pięć części

 

 

Siatka ta wykorzystywana jest np. do dokowanie pasków narzędziowych.

 

import javax.swing.*;
import
java.awt.*;

public class
AplikacjaMenu extends JFrame {
    JTextArea
textArea;
   
AplikacjaMenu(){
       
super("Edytor tekstowy");
       
setSize(400,300);
           
//Ustawienie okna aplikacji naśrodku ekranu
       
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2,
                                                    
(Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);
           
//Tworzenie obiektu ikony z grafiką pobraną z pliku zasobów (bez podawania ścieżki)
       
Image imageIconFrame = new  ImageIcon(getClass().getClassLoader().getResource("ikona_logo.png"))
                .getImage()
;
       
setIconImage(imageIconFrame); // ustawienie ikony aplikacji (lewy górny róg)

            //Stworzenie panelu z siatką rozmieszczenia obiektów BoderLayout
       
JPanel panelG = new JPanel(new BorderLayout());

           
//JTextArea to pole teksowe duże
       
textArea = new JTextArea();
           
//Aby można było przewijać zawartość pola tekstowego stworzono obiekt jScrollPane,
               do krórago przekazano pole tekstowe
          //textArea.setLineWrap(true); //zawijanie wiersza

       
JScrollPane jScrollPane = new JScrollPane(textArea);
           
//Wstawiono scroll z tekstem do centralnej części panelu
       
panelG.add(jScrollPane, BorderLayout.CENTER);

       
setContentPane(panelG);
       
setVisible(true);
   
}

   
public static void main(String[] args) {
       
new AplikacjaMenu();
   
}
}

 

 

PRZYKŁAD 2.

W prezentowanym przykładzie rozszerzono wcześniejszą aplikację umieszczając pasek narzędziowy z kilkoma funkcjami, jak:

kopiowanie i wklejanie tekstu, wyświetlanie okna dialogowego z informacją o programie oraz zamykanie aplikacji. 

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class AplikacjaMenu extends JFrame {
    JTextArea textArea;
    JButton buttonZamknij, buttonKopiuj, buttonWklej, buttonInfo;
 
    AplikacjaMenu(){
        super("Edytor tekstowy");
        setSize(400,300);
        setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);
        Image imageIconFrame = new ImageIcon(getClass().getClassLoader().getResource("ikona_logo.png")).getImage();
        setIconImage(imageIconFrame);
        JPanel panelG = new JPanel(new BorderLayout());
        textArea = new JTextArea();
        JScrollPane jScrollPane = new JScrollPane(textArea);
        panelG.add(jScrollPane, BorderLayout.CENTER);
 
            //Stworzenie paska narzędziowego
        JToolBar pasek = new JToolBar();
 
            //Stworzenie przycisku zamykającego aplikację oraz dodanie go do paska narzędziowego
        buttonZamknij = new JButton("Zamknij");
        buttonZamknij.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        pasek.add(buttonZamknij);
 
            //Stworzenie przycisku kopiuj oraz dodanie go do paska narzędziowego
        buttonKopiuj = new JButton("Kopiuj");
        buttonKopiuj.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.copy();
            }
        });
        pasek.add(buttonKopiuj);
 
            //Stworzenie przycisku wklejającego skopiowany wcześniej tekst oraz dodanie go do paska narzędziowego
        buttonWklej = new JButton("Wklej");
        buttonWklej.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.paste();
            }
        });
        pasek.add(buttonWklej);
 
            //Stworzenie przycisku wyświetlającego informację o programie oraz dodanie go do paska narzędziowego
 
        buttonInfo = new JButton("Info");
        buttonInfo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(AplikacjaMenu.this,
                        "Aplikacja z wykładu nr 6 pokazująca działanie przykładowych \n" +
                                "komponentów graficznych jak paski narzędziowe, menu i inne.\n\n" +
                                "autor programu: Jan Kowalski");
            }
        });
        pasek.add(buttonInfo);
 
        panelG.add(pasek, BorderLayout.NORTH);
        setContentPane(panelG);
        setVisible(true);
    }
 
    public static void main(String[] args) {
        new AplikacjaMenu();
    }
}
 

 

W poniższym programie przedstawiono budowę menu głównego z obsługą zdarzeń. Należ zauważyć, iż menu dodawane jest do ramki aplikacji a nie do panelu.

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class AplikacjaMenu extends JFrame implements ActionListener{
    JTextArea textArea;
    JMenuItem menuItemZamknij, menuItemKopiuj, menuItemWklej, menuItemInfo;
 
    AplikacjaMenu(){
        super("Edytor tekstowy");
        setSize(400,300);
        setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);
        Image imageIconFrame = new ImageIcon(getClass().getClassLoader().getResource("ikona_logo.png")).getImage();
        setIconImage(imageIconFrame);
        JPanel panelG = new JPanel(new BorderLayout());
        textArea = new JTextArea();
        JScrollPane jScrollPane = new JScrollPane(textArea);
        panelG.add(jScrollPane, BorderLayout.CENTER);
 
        JMenuBar jMenuBar = new JMenuBar();
        JMenu menuPlik = new JMenu("Plik");
        JMenu menuEdycja = new JMenu("Edycja");
        JMenu menuInfo = new JMenu("Informacje");
        jMenuBar.add(menuPlik);
        jMenuBar.add(menuEdycja);
        jMenuBar.add(menuInfo);
 
        menuItemZamknij = new JMenuItem("Zamknij");
        menuItemKopiuj = new JMenuItem("Kopiuj");
        menuItemWklej = new JMenuItem("Wklej");
        menuItemInfo = new JMenuItem("O programie");
 
        menuPlik.add(menuItemZamknij);
        menuEdycja.add(menuItemKopiuj);
        menuEdycja.add(menuItemWklej);
        menuInfo.add(menuItemInfo);
 
        menuItemZamknij.addActionListener(this);
        menuItemKopiuj.addActionListener(this);
        menuItemWklej.addActionListener(this);
        menuItemInfo.addActionListener(this);
 
        setJMenuBar(jMenuBar);
 
        setContentPane(panelG);
        setVisible(true);
    }
 
    public static void main(String[] args) {
        new AplikacjaMenu();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if(o==menuItemZamknij){
            System.exit(0);
        }else if(o==menuItemKopiuj){
            textArea.copy();
        }else if(o==menuItemWklej){
            textArea.paste();
        }else if(o==menuItemInfo){
            JOptionPane.showMessageDialog(AplikacjaMenu.this,
                    "Aplikacja z wykładu nr 6 pokazująca działanie przykładowych \n" +
                            "komponentów graficznych jak paski narzędziowe, menu i inne.\n\n" +
                            "autor programu: Jan Kowalski");
        }
    }}

 

 

Aby dodać ikonę do przycisku lub pozycji menu (JMenuItem) należy wykorzystać następujący zapis:

 

ImageIcon imageIconZamknij = new ImageIcon(getClass().getClassLoader().getResource("close.png"));
menuItemZamknij = new JMenuItem("Zamknij", imageIconZamknij);
buttonZamknij = new JButton(imageIconZamknij);
 

 

 

Przykład użycia okna dialogowego z pytaniem o zamknięcie aplikacji:

 

public void actionPerformed(ActionEvent e) {
    int nr = JOptionPane.showConfirmDialog( AplikacjaMenu.this,   "Czy chcesz wyłączyć aplikację?",   "Pytanie",   JOptionPane.YES_NO_OPTION);
    if(nr==0)
        System.exit(0);
}

 

 

Link do tutorialu z innymi przykładami okien dialogowych: https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

 

4. Zadania

 

Zadanie 1

Połącz dwa ostatnie przykłady, tak aby w jednej aplikacji był zarówno pasek narzędziowy jak i menu.

 

Zadanie 2

Napisz program według własnego uznania, w którym umieść poznane w instrukcji elementy graficznego interfejsu użytkownika, jak pasek narzędziowy oraz menu. Zaprojektuj zdarzenia dla przycisków oraz pozycji menu.