Programowanie obiektowe /Java/
Laboratorium nr 12
1
Aplikacja graficzna
1
package
pl.kielce.tu.lab12;
2
3
import
javax.swing.JButton;
4
import
javax.swing.JFrame;
5
import
javax.swing.JWindow;
6
7
public class
TestSwing {
8
public static void
test() {
9
JFrame f =
new
JFrame(
"JFrame"
);
10
f.add(
new
JButton(
"JFrameButton"
));
11
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12
f.setBounds(0, 0, 320, 240);
13
f.setVisible(
true
);
14
JWindow w =
new
JWindow();
15
w.add(
new
JButton(
"JWindowButton"
));
16
w.setBounds(0, 240, 320, 240);
17
w.setVisible(
true
);
18
}
19
20
public static void
main(String[] args) {
21
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
22
public void
run() {
23
test();
24
}
25
});
26
}
27
}
Przykład 1: src/pl/kielce/tu/lab12/TestSwing.java {link}
Jaka jest różnica pomiędzy JF rame a JW indow?
2
Aplety
„(...) apletach
, czyli programach, rozprowadzanych za pośrednictwem Internetu, a przeznaczonych do
uruchamiania w przeglądarkach WWW (ze względów bezpieczeństwa środowisko uruchomieniowe apletu,
tzw. piaskownica - ang. sandbox - jest mocno ograniczone)”
Podstawowe metody klasy JApplet:
- init() – metoda wywoływana w celu poinformowania apletu, że został załadowany,
- start() – metoda wywoływana w celu poinformowania apletu, że powinien rozpocząć działanie, wywo-
ływana po metodzie init() oraz za każdym razem, gdy strona zwierająca aplet jest odwiedzana,
- stop() – metoda wywoływana w celu poinformowania apletu, że powinien zatrzymać działanie, wywo-
ływana przed metodą destroy() oraz za każdym razem, gdy strona zwierająca aplet jest zastępowana
przez inną,
- destroy() – metoda wywoływana w celu poinformowania apletu, że powinien zwolnić wszystkie zaalo-
kowane zasoby, wywoływana przed zniszczeniem apletu.
1
Thinking in Java, Bruce Eckel, Wydanie IV, Helion, 2006
1
3
Obsługa zdarzeń
Uwaga!!! Poniższe programy nie są kompletne. Brakuje kodu odpowiedzialnego za obsługę zdarzeń.
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.event.FocusEvent;
4
import
java.awt.event.FocusListener;
5
import
java.awt.event.KeyEvent;
6
import
java.awt.event.KeyListener;
7
import
java.awt.event.MouseEvent;
8
import
java.awt.event.MouseListener;
9
import
java.awt.event.MouseMotionListener;
10
import
java.awt.event.MouseWheelEvent;
11
import
java.awt.event.MouseWheelListener;
12
import
java.awt.event.WindowEvent;
13
import
java.awt.event.WindowListener;
14
15
import
javax.swing.JFrame;
16
17
public class
TestListeners
extends
JFrame {
18
private static final long
serialVersionUID = 1L;
19
20
TestListeners() {
21
// zdarzenia związane z aktywnością okna
22
this
.addFocusListener(
new
FocusListener() {
23
public void
focusGained(FocusEvent event) {
24
}
25
public void
focusLost(FocusEvent event) {
26
}
27
});
28
// zdarzenia związane z oknem
29
this
.addWindowListener(
new
WindowListener() {
30
public void
windowActivated(WindowEvent event) {
31
}
32
public void
windowClosed(WindowEvent event) {
33
}
34
public void
windowClosing(WindowEvent event) {
35
}
36
public void
windowDeactivated(WindowEvent event) {
37
}
38
public void
windowDeiconified(WindowEvent event) {
39
}
40
public void
windowIconified(WindowEvent event) {
41
}
42
public void
windowOpened(WindowEvent event) {
43
}
44
});
45
// zdarzenia związane z myszką
46
this
.addMouseListener(
new
MouseListener() {
47
public void
mouseClicked(MouseEvent event) {
48
}
49
public void
mouseEntered(MouseEvent event) {
50
}
51
public void
mouseExited(MouseEvent event) {
52
}
53
public void
mousePressed(MouseEvent event) {
54
}
55
public void
mouseReleased(MouseEvent event) {
56
}
57
});
58
this
.addMouseMotionListener(
new
MouseMotionListener() {
2
59
public void
mouseDragged(MouseEvent event) {
60
}
61
public void
mouseMoved(MouseEvent event) {
62
}
63
});
64
this
.addMouseWheelListener(
new
MouseWheelListener() {
65
public void
mouseWheelMoved(MouseWheelEvent event) {
66
}
67
});
68
// zdarzenia związane z klawiaturą
69
this
.addKeyListener(
new
KeyListener() {
70
public void
keyPressed(KeyEvent event) {
71
}
72
public void
keyReleased(KeyEvent event) {
73
}
74
public void
keyTyped(KeyEvent event) {
75
}
76
});
77
}
78
79
public static void
test() {
80
TestListeners f =
new
TestListeners();
81
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
82
f.setBounds(0, 0, 800, 600);
83
f.setVisible(
true
);
84
}
85
86
public static void
main(String[] args) {
87
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
88
public void
run() {
89
test();
90
}
91
});
92
}
93
}
Przykład 2: src/pl/kielce/tu/lab12/TestListeners.java {link}
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.event.FocusAdapter;
4
import
java.awt.event.KeyAdapter;
5
import
java.awt.event.MouseAdapter;
6
import
java.awt.event.MouseMotionAdapter;
7
import
java.awt.event.WindowAdapter;
8
9
import
javax.swing.JFrame;
10
11
public class
TestAdapters
extends
JFrame {
12
private static final long
serialVersionUID = 1L;
13
14
TestAdapters() {
15
// zdarzenia związane z aktywnością okna
16
this
.addFocusListener(
new
FocusAdapter() {
17
});
18
// zdarzenia związane z oknem
19
this
.addWindowListener(
new
WindowAdapter() {
20
});
21
// zdarzenia związane z myszką
22
this
.addMouseListener(
new
MouseAdapter() {
23
});
3
24
this
.addMouseMotionListener(
new
MouseMotionAdapter() {
25
});
26
// zdarzenia związane z klawiaturą
27
this
.addKeyListener(
new
KeyAdapter() {
28
});
29
}
30
31
public static void
test() {
32
TestAdapters f =
new
TestAdapters();
33
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
34
f.setBounds(0, 0, 800, 600);
35
f.setVisible(
true
);
36
}
37
38
public static void
main(String[] args) {
39
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
40
public void
run() {
41
test();
42
}
43
});
44
}
45
}
Przykład 3: src/pl/kielce/tu/lab12/TestAdapters.java {link}
Jaka jest różnica pomiędzy Listener’em a Adapter’em np. KeyListener’em a KeyAdapter’em?
4
Układy graficzne
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.BorderLayout;
4
import
java.awt.CardLayout;
5
import
java.awt.Color;
6
import
java.awt.FlowLayout;
7
import
java.awt.GridBagConstraints;
8
import
java.awt.GridBagLayout;
9
import
java.awt.GridLayout;
10
import
java.awt.event.ActionEvent;
11
import
java.awt.event.ActionListener;
12
import
java.util.Random;
13
14
import
javax.swing.BoxLayout;
15
import
javax.swing.JButton;
16
import
javax.swing.JFrame;
17
import
javax.swing.JPanel;
18
import
javax.swing.JScrollPane;
19
import
javax.swing.JTabbedPane;
20
21
public class
TestLayouts {
22
private static
JFrame createFrame(
int
x,
int
y, String text) {
23
JFrame frame =
new
JFrame(text);
24
frame.setBounds(x, y, 640, 480);
25
return
frame;
26
}
27
28
private static void
showFrame(JFrame frame) {
29
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
30
frame.setVisible(
true
);
31
}
4
32
33
private static void
test() {
34
JFrame frame =
null
;
35
int
x = 0;
36
int
y = 0;
37
38
frame = createFrame(x, x,
"BorderLayout"
);
39
testBorderLayout(frame);
40
showFrame(frame);
41
x += 30;
42
y += 30;
43
44
frame = createFrame(x, x,
"FlowLayout"
);
45
testFlowLayout(frame);
46
showFrame(frame);
47
x += 30;
48
y += 30;
49
50
frame = createFrame(x, x,
"GridLayout"
);
51
testGridLayout(frame);
52
showFrame(frame);
53
x += 30;
54
y += 30;
55
56
frame = createFrame(x, x,
"BoxLayout"
);
57
testBoxLayout(frame);
58
showFrame(frame);
59
x += 30;
60
y += 30;
61
62
frame = createFrame(x, x,
"GridBagLayout"
);
63
testGridBagLayout(frame);
64
showFrame(frame);
65
x += 30;
66
y += 30;
67
68
frame = createFrame(x, x,
"CardLayout"
);
69
testCardLayout(frame);
70
showFrame(frame);
71
x += 30;
72
y += 30;
73
74
frame = createFrame(x, x,
"NoLayout"
);
75
testNoLayout(frame);
76
showFrame(frame);
77
x += 30;
78
y += 30;
79
80
frame = createFrame(x, x,
"JScrollPane"
);
81
testJScrollPane(frame);
82
showFrame(frame);
83
x += 30;
84
y += 30;
85
86
frame = createFrame(x, x,
"JTabbedPane"
);
87
testJTabbedPane(frame);
88
showFrame(frame);
89
x += 30;
90
y += 30;
91
}
92
93
public static void
main(String[] args) {
5
94
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
95
public void
run() {
96
test();
97
}
98
});
99
}
100
101
private static void
testBorderLayout(JFrame frame) {
102
frame.getContentPane().setLayout(
new
BorderLayout());
103
for
(
int
i = 0; i < 5; i++)
104
switch
(i) {
105
case
0:
106
frame.getContentPane().add(
new
JButton(
""
+ i),
107
BorderLayout.NORTH);
108
break
;
109
case
1:
110
frame.getContentPane().add(
new
JButton(
""
+ i),
111
BorderLayout.WEST);
112
break
;
113
case
2:
114
frame.getContentPane().add(
new
JButton(
""
+ i),
115
BorderLayout.CENTER);
116
break
;
117
case
3:
118
frame.getContentPane().add(
new
JButton(
""
+ i),
119
BorderLayout.EAST);
120
break
;
121
case
4:
122
frame.getContentPane().add(
new
JButton(
""
+ i),
123
BorderLayout.SOUTH);
124
break
;
125
}
126
}
127
128
private static void
testFlowLayout(JFrame frame) {
129
frame.getContentPane().setLayout(
new
FlowLayout());
130
for
(
int
i = 0; i < 20; i++)
131
frame.getContentPane().add(
new
JButton(
""
+ i));
132
}
133
134
private static void
testGridLayout(JFrame frame) {
135
frame.getContentPane().setLayout(
new
GridLayout(3, 2));
136
for
(
int
i = 0; i < 20; i++)
137
frame.getContentPane().add(
new
JButton(
""
+ i));
138
}
139
140
private static void
testBoxLayout(JFrame frame) {
141
JPanel panel =
new
JPanel();
142
panel.setLayout(
new
BoxLayout(panel, BoxLayout.Y_AXIS));
143
for
(
int
i = 0; i < 20; i++)
144
panel.add(
new
JButton(
""
+ i));
145
frame.getContentPane().add(panel);
146
}
147
148
private static void
testGridBagLayout(JFrame frame) {
149
frame.getContentPane().setLayout(
new
GridBagLayout());
150
GridBagConstraints gbc =
new
GridBagConstraints();
151
for
(
int
i = 0; i < 20; i++) {
152
gbc.gridx = i;
153
gbc.gridy = i;
154
frame.getContentPane().add(
new
JButton(
""
+ i), gbc);
155
}
6
156
}
157
158
private static int
card = 1;
159
private static
JPanel cards;
160
private static
CardLayout layout;
161
162
private static void
testCardLayout(JFrame frame) {
163
JButton b1 =
new
JButton(
"First Press to change to second"
);
164
b1.addActionListener(
new
ActionListener() {
165
@Override
166
public void
actionPerformed(ActionEvent e) {
167
change();
168
}
169
});
170
JPanel card1 =
new
JPanel();
171
card1.setBackground(Color.ORANGE);
172
card1.add(b1);
173
174
JButton b2 =
new
JButton(
"Second Press to change to first"
);
175
b2.addActionListener(
new
ActionListener() {
176
@Override
177
public void
actionPerformed(ActionEvent e) {
178
change();
179
}
180
});
181
JPanel card2 =
new
JPanel();
182
card2.setBackground(Color.YELLOW);
183
card2.add(b2);
184
185
layout =
new
CardLayout();
186
cards =
new
JPanel(layout);
187
cards.add(card1,
"===0==="
);
188
cards.add(card2,
"===1==="
);
189
190
frame.add(cards);
191
}
192
193
static private void
change() {
194
layout.show(cards,
"==="
+ card +
"==="
);
195
card++;
196
card %= 2;
197
}
198
199
private static void
testNoLayout(JFrame frame) {
200
frame.getContentPane().setLayout(
null
);
201
Random r =
new
Random();
202
for
(
int
i = 0; i < 20; i++) {
203
JButton b =
new
JButton(
""
+ i);
204
b.setBounds(80 * r.nextInt(10), 60 * r.nextInt(10), 60, 20);
205
frame.getContentPane().add(b);
206
}
207
}
208
209
private static void
testJScrollPane(JFrame frame) {
210
JPanel panel =
new
JPanel();
211
panel.setLayout(
new
BoxLayout(panel, BoxLayout.Y_AXIS));
212
for
(
int
i = 0; i < 20; i++)
213
panel.add(
new
JButton(
""
+ i));
214
frame.getContentPane().add(
new
JScrollPane(panel));
215
}
216
217
private static void
testJTabbedPane(JFrame frame) {
7
218
Random r =
new
Random();
219
JTabbedPane tabs =
new
JTabbedPane(JTabbedPane.LEFT);
220
tabs.setTabPlacement(JTabbedPane.TOP);
221
for
(
int
i = 0; i < 5; i++)
222
tabs.addTab(
""
+ i,
new
JButton(
""
+ (r.nextInt(100) + i)));
223
frame.getContentPane().add(tabs);
224
}
225
}
Przykład 4: src/pl/kielce/tu/lab12/TestLayouts.java {link}
Przykład „klawiatura ekranowa”:
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.BorderLayout;
4
import
java.awt.GridLayout;
5
import
java.awt.event.ActionEvent;
6
import
java.awt.event.ActionListener;
7
8
import
javax.swing.JButton;
9
import
javax.swing.JFrame;
10
import
javax.swing.JPanel;
11
import
javax.swing.JTextField;
12
13
public class
TestScreenKeyboard {
14
15
public static void
test() {
16
JFrame frame =
new
JFrame();
17
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18
JPanel panel =
new
JPanel();
19
panel.setLayout(
new
BorderLayout());
20
final
JTextField a =
new
JTextField();
21
panel.add(a, BorderLayout.NORTH);
22
JPanel keyboard =
new
JPanel();
23
keyboard.setLayout(
new
GridLayout(10, 10));
24
for
(
int
i = 33; i < 127; i++) {
25
JButton b =
new
JButton(
""
+ (
char
) i);
26
b.addActionListener(
new
ActionListener() {
27
public void
actionPerformed(ActionEvent e) {
28
System.out.print(e.getActionCommand());
29
a.setText(a.getText() + e.getActionCommand());
30
}
31
});
32
keyboard.add(b);
33
}
34
panel.add(keyboard, BorderLayout.CENTER);
35
frame.add(panel);
36
37
frame.setBounds(0, 0, 800, 600);
38
frame.setVisible(
true
);
39
}
40
41
public static void
main(String[] args) {
42
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
43
public void
run() {
44
test();
45
}
46
});
47
}
48
49
}
8
Przykład 5: src/pl/kielce/tu/lab12/TestScreenKeyboard.java {link}
5
Tworzenie własnych komponentów
W celu utworzenia własnego komponentu należy w klasie dziedziczącej po JComponent przesłonić metodę
public void paintComponent(Graphics g).
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.Color;
4
import
java.awt.Graphics;
5
import
java.awt.Graphics2D;
6
7
import
javax.swing.JComponent;
8
import
javax.swing.JFrame;
9
10
public class
TestMyComponent
extends
JComponent {
11
12
private static final long
serialVersionUID = 1L;
13
14
public void
paintComponent(Graphics g) {
15
Graphics2D g2d = (Graphics2D) g;
16
17
g2d.setColor(Color.BLUE);
18
g2d.drawRect(-100, -100, 200, 200);
19
20
g2d.setColor(Color.RED);
21
g2d.translate(
this
.getWidth() / 2,
this
.getHeight() / 2);
22
g2d.drawRect(-100, -100, 200, 200);
23
24
g2d.setColor(Color.GREEN);
25
g2d.rotate(Math.PI / 4);
26
g2d.drawRect(-100, -100, 200, 200);
27
28
g2d.setColor(Color.ORANGE);
29
g2d.scale(1.5, 1.5);
30
g2d.drawRect(-100, -100, 200, 200);
31
32
g2d.setColor(Color.BLACK);
33
g2d.shear(-0.1, 0.1);
34
g2d.drawRect(-100, -100, 200, 200);
35
}
36
37
public static void
test() {
38
JFrame f =
new
JFrame();
39
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
40
f.setBounds(0, 0, 640, 480);
41
f.add(
new
TestMyComponent());
42
f.setVisible(
true
);
43
}
44
45
public static void
main(String[] args) {
46
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
47
public void
run() {
48
test();
49
}
50
});
51
}
52
}
9
Przykład 6: src/pl/kielce/tu/lab12/TestMyComponent.java {link}
6
Zmiana wyglądu aplikacji
Przy zmianie wyglądu aplikacji zaleca się, aby jedną z poniższych instrukcji dodać jako pierwszą instrukcję
w metodzie main(). Ze względu na rodzaj systemu operacyjnego oraz wersję Javy nie zawsze wszystkie zmiany
są możliwe do wykonania.
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.mac.MacLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
7
Okna dialogowe
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.Color;
4
import
java.io.File;
5
import
javax.swing.JCheckBox;
10
6
import
javax.swing.JColorChooser;
7
import
javax.swing.JFileChooser;
8
import
javax.swing.JOptionPane;
9
import
javax.swing.JPasswordField;
10
import
javax.swing.JTextField;
11
12
enum
Days {
13
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
14
}
15
16
public class
TestDialogs {
17
18
public static void
test() {
19
//okno dialogowe z wiadomością
20
JOptionPane.showMessageDialog(
null
,
"Message Dialog Text"
,
21
"Message Dialog"
, JOptionPane.ERROR_MESSAGE);
22
23
//okno dialogowe z pytaniem o potwierdzenie
24
int
answer1 = JOptionPane.showConfirmDialog(
null
,
25
"Confirm Dialog Text"
,
"Confirm Dialog"
,
26
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
27
switch
(answer1) {
28
case
JOptionPane.YES_OPTION:
29
System.out.println(
"YES_OPTION"
);
30
break
;
31
case
JOptionPane.NO_OPTION:
32
System.out.println(
"NO_OPTION"
);
33
break
;
34
case
JOptionPane.CANCEL_OPTION:
35
System.out.println(
"CANCEL_OPTION"
);
36
break
;
37
}
38
39
//okno dialogowe służące do wprowadzania tekstów
40
String answer2 = JOptionPane.showInputDialog(
"Input"
);
41
System.out.println(answer2);
42
43
//okno dialogowe umożliwiające wybór z listy rozwijanej
44
Object selectedOption = JOptionPane.showInputDialog(
null
,
"Message"
,
45
"Title"
, JOptionPane.QUESTION_MESSAGE,
null
, Days.values(),
46
Days.WEDNESDAY);
47
System.out.println(selectedOption);
48
49
//okno dialogowe umożliwiające wpisanie loginu i hasła
50
JTextField login =
new
JTextField();
51
JPasswordField password =
new
JPasswordField();
52
JCheckBox remeberMe =
new
JCheckBox(
"Rememeber me"
);
53
int
answer = JOptionPane.showOptionDialog(
null
,
new
Object[] {
54
"Login:"
, login,
"Password:"
, password, remeberMe },
55
"Login Dialog"
, JOptionPane.OK_CANCEL_OPTION,
56
JOptionPane.QUESTION_MESSAGE,
null
,
null
,
null
);
57
if
(answer == JOptionPane.OK_OPTION) {
58
System.out.println(login.getText());
59
System.out.println(
new
String(password.getPassword()));
60
System.out.println(remeberMe.isSelected());
61
}
62
63
//okno dialogowe umożliwiające wybór jednej z opcji
64
answer = JOptionPane.showOptionDialog(
null
,
"Message"
,
"Title"
,
65
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
66
null
, Days.values(), Days.WEDNESDAY);
67
if
(answer != -1)
11
68
System.out.println(Days.values()[answer]);
69
70
//okno dialogowe wyboru pliku
71
JFileChooser f =
new
JFileChooser();
72
f.setMultiSelectionEnabled(
true
);
73
int
status = f.showOpenDialog(
null
);
74
if
(status == JFileChooser.APPROVE_OPTION) {
75
File[] files = f.getSelectedFiles();
76
for
(File file : files)
77
System.out.println(file);
78
}
79
//okno dialogowe wyboru katalogu
80
JFileChooser f2 =
new
JFileChooser();
81
f2.setMultiSelectionEnabled(
true
);
82
f2.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
83
int
status2 = f2.showOpenDialog(
null
);
84
if
(status2 == JFileChooser.APPROVE_OPTION) {
85
File[] files = f2.getSelectedFiles();
86
for
(File file : files)
87
System.out.println(file);
88
}
89
//okno dialogowe wyboru koloru
90
System.out.println(JColorChooser.showDialog(
null
,
"Select color"
,
91
Color.GREEN));
92
}
93
94
public static void
main(String[] args) {
95
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
96
public void
run() {
97
test();
98
}
99
});
100
}
101
}
Przykład 7: src/pl/kielce/tu/lab12/TestDialogs.java {link}
8
Komponenty
Przykład użycia menu głównego, menu kontekstowego oraz innych komponenty. Uwaga!!! Menu kontek-
stowe działa na belce menu głównego.
1
package
pl.kielce.tu.lab12;
2
3
import
java.awt.Component;
4
import
java.awt.GridLayout;
5
import
java.awt.event.ActionEvent;
6
import
java.awt.event.ActionListener;
7
import
java.awt.event.KeyEvent;
8
import
java.awt.event.MouseAdapter;
9
import
java.awt.event.MouseEvent;
10
import
javax.swing.ButtonGroup;
11
import
javax.swing.JButton;
12
import
javax.swing.JCheckBox;
13
import
javax.swing.JComboBox;
14
import
javax.swing.JFrame;
15
import
javax.swing.JList;
16
import
javax.swing.JMenu;
17
import
javax.swing.JMenuBar;
18
import
javax.swing.JMenuItem;
12
19
import
javax.swing.JOptionPane;
20
import
javax.swing.JPopupMenu;
21
import
javax.swing.JRadioButton;
22
import
javax.swing.JScrollPane;
23
import
javax.swing.JSeparator;
24
import
javax.swing.JToggleButton;
25
import
javax.swing.plaf.basic.BasicArrowButton;
26
27
public class
TestComponents {
28
29
public static void
test() {
30
JFrame f =
new
JFrame();
31
32
//Meny główne
33
JMenuBar bar =
new
JMenuBar();
34
JMenu m1 =
new
JMenu(
"File"
);
35
JMenuItem i1 =
new
JMenuItem(
"Exit"
, KeyEvent.VK_X);
36
i1.addActionListener(
new
ActionListener() {
37
public void
actionPerformed(ActionEvent e) {
38
System.out.println(
"Exit"
);
39
System.exit(0);
40
}
41
});
42
m1.add(i1);
43
bar.add(m1);
44
45
JMenu m2 =
new
JMenu(
"Help"
);
46
JMenuItem i2 =
new
JMenuItem(
"About"
);
47
i2.addActionListener(
new
ActionListener() {
48
public void
actionPerformed(ActionEvent e) {
49
System.out.println(
"About"
);
50
JOptionPane.showMessageDialog(
null
,
"About"
);
51
}
52
});
53
m2.add(i2);
54
bar.add(m2);
55
f.setJMenuBar(bar);
56
57
// Klasy potomne javax.swing.AbstractButton
58
f.setLayout(
new
GridLayout(6, 2));
59
f.add(
new
JButton(
"JButton"
));
60
f.add(
new
JToggleButton(
"JToggleButton"
));
61
f.add(
new
JCheckBox(
"JCheckBox"
));
62
f.add(
new
JRadioButton(
"JRadioBox"
));
63
f.add(
new
BasicArrowButton(BasicArrowButton.WEST));
64
f.add(
new
BasicArrowButton(BasicArrowButton.EAST));
65
66
// Grupy przycisków
67
ButtonGroup g =
new
ButtonGroup();
68
JCheckBox b1 =
new
JCheckBox(
"JCheckBox1 <= lub =>"
);
69
g.add(b1);
70
f.add(b1);
71
JCheckBox b2 =
new
JCheckBox(
"<= lub => JCheckBox2 "
);
72
g.add(b2);
73
f.add(b2);
74
JRadioButton b3 =
new
JRadioButton(
"JRadioBox1 <= lub => "
);
75
g.add(b3);
76
f.add(b3);
77
JRadioButton b4 =
new
JRadioButton(
"<= lub => JRadioBox2"
);
78
g.add(b4);
79
f.add(b4);
80
13
81
// Komponent związane z wyborem opcji
82
Object[] o =
new
Object[] {
"Poniedziałek"
,
"Wtorek"
,
"Środa"
,
83
"Czwartek"
,
"Piątek"
,
"Sobota"
,
"Niedziela"
};
84
JComboBox combo =
new
JComboBox(o);
85
f.add(combo);
86
JList list =
new
JList(o);
87
f.add(
new
JScrollPane(list));
88
89
// Menu kontekstowe
90
final
JPopupMenu p =
new
JPopupMenu(
"SecondMenu"
);
91
p.add(
new
JMenuItem(
"Item1"
));
92
p.add(
new
JMenuItem(
"Item2"
));
93
p.add(
new
JSeparator());
94
p.add(
new
JMenuItem(
"Item3"
));
95
bar.addMouseListener(
new
MouseAdapter() {
96
@Override
97
public void
mousePressed(MouseEvent e) {
98
if
(e.getButton() == MouseEvent.BUTTON3) {
99
System.out.println(
"Popup"
);
100
p.show((Component) e.getSource(), e.getX(), e.getY());
101
}
102
}
103
});
104
105
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
106
f.setBounds(0, 0, 480, 640);
107
f.setVisible(
true
);
108
}
109
110
public static void
main(String[] args) {
111
javax.swing.SwingUtilities.invokeLater(
new
Runnable() {
112
public void
run() {
113
TestComponents.test();
114
}
115
});
116
}
117
}
Przykład 8: src/pl/kielce/tu/lab12/TestComponents.java {link}
9
Zasada jednego wątku
Zasada jednego wątku
: „Nie należy operować na komponentach Swing w żadnym innym wątku niż wątek
dystrybucji zdarzeń.”
„Od zasady jednego wątku jest kilka wyjątków.
- Słuchaczy zdarzeń można bezpiecznie dodawać i usuwać w każdym wątku. Oczywiście metody słuchaczy
są wywoływane w wątku dystrybucji zdarzeń.
- Niektóre metody Swing są bezpieczne wątkowo. W dokumentacji API są one oznaczone specjalnym
hasłem ’This method is thread safe, although most Swing methods are not.’ (Metoda ta jest bezpieczna
wątkowo, mimo iż większość metod biblioteki Swing nie jest). (...)”
Poniższe metody dodają obiekt klasy implementującej Runnable do kolejki zdarzeń. Metoda run zostanie
wykonana asynchronicznie.
SwingUtilities.invokeLater(Runnable runnable);
EventQueue.invokeLater(Runnable runnable);
2
Horstmann C.S., Cornell G., Java Podstawy, Helion, Wyd. VIII, 2009
14
Poniższe metody dodają obiekt klasy implementującej Runnable do kolejki zdarzeń. Metoda czeka na
wykonanie metody run.
SwingUtilities.invokeAndWait(Runnable runnable);
EventQueue.invokeAndWait(Runnable runnable);
10
Przykładowa treść laboratorium
Proszę stworzyć aplikację graficzną pokazującą możliwości pakietu Swing takie jak układy graficzne,
przyciski, itd. Aplikacja powinna zawierać menu główne, menu kontekstowe oraz zakładki.
Menu główne:
Plik
Okna dialogowe
Układy graficzne
Komponenty
Pomoc
separator
WybierzKolor
BorderLayout
JButton
Autor
Koniec
...
...
...
...
Program powinien zawierać obsługę wszystkich pól w menu. Po kliknięciu na wybrane pole powinien
pojawić się (np. w oknie dialogowym JOptionP ane.showOptionDialog()) przykład dotyczący wybranego
tematu (np. JButton).
15