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.