lab12

background image

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

1

, 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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

2

: „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

background image

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


Document Outline


Wyszukiwarka

Podobne podstrony:
Lab12 Applications
lab12 1 7
lab12 5 1
LAB12
LAB12 Regulator cyfrowy
lab12 RapidPrototyping EN
Lab12 4 1
12 (2), Elektrotechnika AGH, Semestr II letni 2012-2013, Fizyka II - Laboratorium, laborki, laborki
Lab12 RapidPrototyping
Lab12
TECH INT lab12 2014, Studia - Politechnika Opolska, Semestr 6, Techniki Internetowe
LAB12 , Modu˙ sztywno˙ci
lab12 SWBlab12
lab12
lab12 6 3
lab12 4 3
Lab12 RapidPrototyping
Lab12 13spr, PWr, III semestr, MUD
LAB12, TARASIUK

więcej podobnych podstron