?????????
寫得很有條理啊 呵呵
?
??1
import
?java.awt.
*
;
??2
import
?java.awt.event.
*
;
??3
import
?javax.swing.JPopupMenu;
??4
import
?javax.swing.JMenu;
??5
import
?javax.swing.JMenuItem;
??6
import
?javax.swing.JCheckBoxMenuItem;
??7
import
?javax.swing.JRadioButtonMenuItem;
??8
import
?javax.swing.ButtonGroup;
??9
import
?javax.swing.JMenuBar;
?10
import
?javax.swing.KeyStroke;
?11
import
?javax.swing.ImageIcon;?
?12
?13
import
?javax.swing.JPanel;
?14
import
?javax.swing.JTextArea;
?15
import
?javax.swing.JScrollPane;
?16
import
?javax.swing.JFrame;?
?17
?18
/**/
/*
?PopupMenuDemo.java?requires?images/middle.gif.?
*/
?
?19
?20
/**/
/*
?21
?*?Like?MenuDemo,?but?with?popup?menus?added.
?22
?
*/
?23
public
?
class
?PopupMenuDemo?
implements
?ActionListener,?ItemListener?
{??????
//
負責對點擊事件的監聽
?24
????JTextArea?output;??????????????????????????????????????????????????????????????????????????????????????
//
負責輸出的變量
?25
????JScrollPane?scrollPane;??????????????????????????????????????????????????????????????????????????????
//
創建畫板
?26
????String?newline?
=
?
"
\n
"
;?????????????????????????????????????????????????????????????????????????????????
//
每輸出一次,大回車?
?27
?28
????
public
?JMenuBar?createMenuBar()?
{????????????????????????????????????????????????????????????
//
創建菜單欄JMenuBar?函數
?29
?????????????????????????????????????????????????????????????????????????
?30
??????????????????????????????????????????????????????????????????????????
//
這里要解釋一下,J*?(如:JMenuBar)是swing提供的
?31
??????????????????????????????????????????????????????????????????????????
//
而,?*?(如:MenuBar)是由awt提供的
?32
????????JMenuBar?menuBar;
?33
????????JMenu?menu,?submenu;
?34
????????JMenuItem?menuItem;
?35
????????JRadioButtonMenuItem?rbMenuItem;
?36
????????JCheckBoxMenuItem?cbMenuItem;?
?37
?38
????????
//
Create?the?menu?bar.???????????????
?39
????????menuBar?
=
?
new
?JMenuBar();??????????????????????????????????????????????????????????????????
//
創建菜單欄JMenuBar?
?40
?41
????????
//
Build?the?first?menu.
?42
????????menu?
=
?
new
?JMenu(
"
A?Menu
"
);?????????????????????????????????????????????????????????????
//
創建第一個menu
?43
????????menu.setMnemonic(KeyEvent.VK_A);???????????????????????????????????????????????????
//
指定鍵盤助記符的?menu
?44
????????menu.getAccessibleContext().setAccessibleDescription(
?45
????????????????
"
The?only?menu?in?this?program?that?has?menu?items
"
);????????????????????
//
第一個menu內容
?46
????????menuBar.add(menu);??????????????????????????????????????????????????????????????????????????????
//
將menu加入菜單欄?
?47
?48
????????
//
a?group?of?JMenuItems??????????????????????????????????????????????????????????????????????????
//
下同
?49
????????menuItem?
=
?
new
?JMenuItem(
"
A?text-only?menu?item
"
,
?50
?????????????????????????????????KeyEvent.VK_T);
?51
????????
//
menuItem.setMnemonic(KeyEvent.VK_T);?
//
used?constructor?instead
?52
????????menuItem.setAccelerator(KeyStroke.getKeyStroke(
?53
????????????????KeyEvent.VK_1,?ActionEvent.ALT_MASK));
?54
????????menuItem.getAccessibleContext().setAccessibleDescription(
?55
????????????????
"
This?doesn't?really?do?anything
"
);
?56
????????menuItem.addActionListener(
this
);
?57
????????menu.add(menuItem);?
?58
?59
????????ImageIcon?icon?
=
?createImageIcon(
"
images/middle.gif
"
);????????????????????????
//
這里有圖片
?60
????????menuItem?
=
?
new
?JMenuItem(
"
Both?text?and?icon
"
,?icon);
?61
????????menuItem.setMnemonic(KeyEvent.VK_B);
?62
????????menuItem.addActionListener(
this
);
?63
????????menu.add(menuItem);?
?64
?65
????????menuItem?
=
?
new
?JMenuItem(icon);
?66
????????menuItem.setMnemonic(KeyEvent.VK_D);
?67
????????menuItem.addActionListener(
this
);
?68
????????menu.add(menuItem);?
?69
?70
????????
//
a?group?of?radio?button?menu?items
?71
????????menu.addSeparator();?????????????????????????????????????
//
將新分隔符追加到菜單的末尾???????????????????????????????????????????????????????????????????????????????????
?72
????????
?73
????????ButtonGroup?group?
=
?
new
?ButtonGroup();???????????????????
//
創建Button集?
?74
?75
????????rbMenuItem?
=
?
new
?JRadioButtonMenuItem(
"
A?radio?button?menu?item
"
);?????
//
加入單選(1)
?76
????????rbMenuItem.setSelected(
true
);
?77
????????rbMenuItem.setMnemonic(KeyEvent.VK_R);
?78
????????group.add(rbMenuItem);
?79
????????rbMenuItem.addActionListener(
this
);??
//
設置事件監聽?????????????????????????????????
?80
????????menu.add(rbMenuItem);?
?81
?82
????????rbMenuItem?
=
?
new
?JRadioButtonMenuItem(
"
Another?one
"
);??????????????????
//
加入單選(2)
?83
????????rbMenuItem.setMnemonic(KeyEvent.VK_O);
?84
????????group.add(rbMenuItem);
?85
????????rbMenuItem.addActionListener(
this
);
?86
????????menu.add(rbMenuItem);?
?87
?88
????????
//
a?group?of?check?box?menu?items
?89
????????menu.addSeparator();??????????????????????????????????????????????????
//
將新分隔符追加到菜單的末尾???
?90
????????cbMenuItem?
=
?
new
?JCheckBoxMenuItem(
"
A?check?box?menu?item
"
);??????????
//
加入復選(1)
?91
????????cbMenuItem.setMnemonic(KeyEvent.VK_C);
?92
????????cbMenuItem.addItemListener(
this
);
?93
????????menu.add(cbMenuItem);?
?94
?95
????????cbMenuItem?
=
?
new
?JCheckBoxMenuItem(
"
Another?one
"
);?????????????????????
//
加入復選(2)
?96
????????cbMenuItem.setMnemonic(KeyEvent.VK_H);
?97
????????cbMenuItem.addItemListener(
this
);
?98
????????menu.add(cbMenuItem);?
?99
100
????????
//
a?submenu????????????????????????????????????????????????????????????
//
創建具有子菜單的超級菜單
101
????????menu.addSeparator();?????????????????????????????
102
????????submenu?
=
?
new
?JMenu(
"
A?submenu
"
);???????????????????????????????????????
//
父menu?(submenu)
103
????????submenu.setMnemonic(KeyEvent.VK_S);?
104
105
????????menuItem?
=
?
new
?JMenuItem(
"
An?item?in?the?submenu
"
);?????????????????????
//
子?menu1?(menuItem)??????????
106
????????menuItem.setAccelerator(KeyStroke.getKeyStroke(
107
????????????????KeyEvent.VK_2,?ActionEvent.ALT_MASK));
108
????????menuItem.addActionListener(
this
);
109
????????submenu.add(menuItem);?
110
111
????????menuItem?
=
?
new
?JMenuItem(
"
Another?item
"
);????????????????????????????????
//
子?menu2?(menuItem)
112
????????menuItem.addActionListener(
this
);
113
????????submenu.add(menuItem);
114
????????menu.add(submenu);?
115
116
????????
//
Build?second?menu?in?the?menu?bar.????????????????????????????????????
//
另一個菜單
117
????????menu?
=
?
new
?JMenu(
"
Another?Menu
"
);
118
????????menu.setMnemonic(KeyEvent.VK_N);
119
????????menu.getAccessibleContext().setAccessibleDescription(
120
????????????????
"
This?menu?does?nothing
"
);
121
????????menuBar.add(menu);?
122
123
????????
return
?menuBar;
124
????}
?
125
126
????
public
?Container?createContentPane()?
{???????????????????????????????????????
//
創建中間畫板
127
????????
//
Create?the?content-pane-to-be.
128
????????JPanel?contentPane?
=
?
new
?JPanel(
new
?BorderLayout());
129
????????contentPane.setOpaque(
true
);?
130
131
????????
//
Create?a?scrolled?text?area.
132
????????output?
=
?
new
?JTextArea(
5
,?
30
);
133
????????output.setEditable(
false
);
134
????????scrollPane?
=
?
new
?JScrollPane(output);?
135
136
????????
//
Add?the?text?area?to?the?content?pane.
137
????????contentPane.add(scrollPane,?BorderLayout.CENTER);?
138
139
????????
return
?contentPane;
140
????}
?
141
142
????
public
?
void
?createPopupMenu()?
{??????????????????????????????????????????????
//
創建右擊菜單,,不懂請看我的另一篇文章?
143
144
????????JMenuItem?menuItem;?
145
146
????????
//
Create?the?popup?menu.
147
????????JPopupMenu?popup?
=
?
new
?JPopupMenu();
148
????????menuItem?
=
?
new
?JMenuItem(
"
A?popup?menu?item
"
);
149
????????menuItem.addActionListener(
this
);
150
????????popup.add(menuItem);
151
????????menuItem?
=
?
new
?JMenuItem(
"
Another?popup?menu?item
"
);
152
????????menuItem.addActionListener(
this
);
153
????????popup.add(menuItem);?
154
155
????????
//
Add?listener?to?the?text?area?so?the?popup?menu?can?come?up.
156
????????MouseListener?popupListener?
=
?
new
?PopupListener(popup);
157
????????output.addMouseListener(popupListener);
158
????}
?
159
160
????
public
?
void
?actionPerformed(ActionEvent?e)?
{?????????????????????????????????????????????
//
創建菜單監聽
161
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//
并做出相應的事件
162
????????JMenuItem?source?
=
?(JMenuItem)(e.getSource());
163
????????String?s?
=
?
"
Action?event?detected.
"
164
???????????????????
+
?newline
165
???????????????????
+
?
"
????Event?source:?
"
?
+
?source.getText()
166
???????????????????
+
?
"
?(an?instance?of?
"
?
+
?getClassName(source)?
+
?
"
)
"
;
167
????????output.append(s?
+
?newline);
168
????????output.setCaretPosition(output.getDocument().getLength());
169
????}
?
170
171
????
public
?
void
?itemStateChanged(ItemEvent?e)?
{??????????????????????????????????????????????
//
監聽多選框
172
????????JMenuItem?source?
=
?(JMenuItem)(e.getSource());
173
????????String?s?
=
?
"
Item?event?detected.
"
174
???????????????????
+
?newline
175
???????????????????
+
?
"
????Event?source:?
"
?
+
?source.getText()
176
???????????????????
+
?
"
?(an?instance?of?
"
?
+
?getClassName(source)?
+
?
"
)
"
177
???????????????????
+
?newline
178
???????????????????
+
?
"
????New?state:?
"
179
???????????????????
+
?((e.getStateChange()?
==
?ItemEvent.SELECTED)?
?
180
?????????????????????
"
selected
"
:
"
unselected
"
);
181
????????output.append(s?
+
?newline);
182
????????output.setCaretPosition(output.getDocument().getLength());
183
????}
?
184
185
????
//
?Returns?just?the?class?name?--?no?package?info.
186
????
protected
?String?getClassName(Object?o)?
{?????????????????????????????????????????????
//
創建函數,獲取所調用的函數的名稱
187
????????String?classString?
=
?o.getClass().getName();
188
????????
int
?dotIndex?
=
?classString.lastIndexOf(
"
.
"
);
189
????????
return
?classString.substring(dotIndex
+
1
);
190
????}
?
191
192
????
/**?*/
/**
?Returns?an?ImageIcon,?or?null?if?the?path?was?invalid.?
*/
193
????
protected
?
static
?ImageIcon?createImageIcon(String?path)?
{???????????????????????????
//
調用前面的gif圖片
194
????????java.net.URL?imgURL?
=
?PopupMenuDemo.
class
.getResource(path);
195
????????
if
?(imgURL?
!=
?
null
)?
{
196
????????????
return
?
new
?ImageIcon(imgURL);
197
????????}
?
else
?
{
198
????????????System.err.println(
"
Couldn't?find?file:?
"
?
+
?path);
199
????????????
return
?
null
;
200
????????}
201
????}
?
202
203
????
/**?*/
/**
204
?????*?Create?the?GUI?and?show?it.??For?thread?safety,
205
?????*?this?method?should?be?invoked?from?the
206
?????*?event-dispatching?thread.
207
?????
*/
208
????
private
?
static
?
void
?createAndShowGUI()?
{??????????????????????????
//
創建所須GUI線程(控件),并進行設置
209
????????
//
Create?and?set?up?the?window.
210
????????JFrame?frame?
=
?
new
?JFrame(
"
PopupMenuDemo
"
);
211
????????frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);?
212
213
????????
//
Create/set?menu?bar?and?content?pane.
214
????????PopupMenuDemo?demo?
=
?
new
?PopupMenuDemo();
215
????????frame.setJMenuBar(demo.createMenuBar());
216
????????frame.setContentPane(demo.createContentPane());?
217
218
????????
//
Create?and?set?up?the?popup?menu.
219
????????demo.createPopupMenu();?
220
221
????????
//
Display?the?window.
222
????????frame.setSize(
450
,?
260
);
223
????????frame.setVisible(
true
);
224
????}
?
225
226
????
public
?
static
?
void
?main(String[]?args)?
{??????????????????????????????????
//
主函數
227
????????
//
Schedule?a?job?for?the?event-dispatching?thread:
228
????????
//
creating?and?showing?this?application's?GUI.
229
????????javax.swing.SwingUtilities.invokeLater(
new
?Runnable()?
{
230
????????????
public
?
void
?run()?
{
231
????????????????createAndShowGUI();
232
????????????}
233
????????}
);
234
????}
?
235
236
????
class
?PopupListener?
extends
?MouseAdapter?
{?????????????????????????????????
//
右擊菜單監聽
237
????????JPopupMenu?popup;?
238
239
????????PopupListener(JPopupMenu?popupMenu)?
{
240
????????????popup?
=
?popupMenu;
241
????????}
?
242
243
????????
public
?
void
?mousePressed(MouseEvent?e)?
{
244
????????????maybeShowPopup(e);
245
????????}
?
246
247
????????
public
?
void
?mouseReleased(MouseEvent?e)?
{
248
????????????maybeShowPopup(e);
249
????????}
?
250
251
????????
private
?
void
?maybeShowPopup(MouseEvent?e)?
{
252
????????????
if
?(e.isPopupTrigger())?
{
253
????????????????popup.show(e.getComponent(),
254
???????????????????????????e.getX(),?e.getY());
255
????????????}
256
????????}
257
????}
258
259
260
261
}
?
262

??2

??3

??4

??5

??6

??7

??8

??9

?10

?11

?12

?13

?14

?15

?16

?17

?18


?19

?20


?21

?22

?23



?24

?25

?26

?27

?28



?29

?30

?31

?32

?33

?34

?35

?36

?37

?38

?39

?40

?41

?42

?43

?44

?45

?46

?47

?48

?49

?50

?51

?52

?53

?54

?55

?56

?57

?58

?59

?60

?61

?62

?63

?64

?65

?66

?67

?68

?69

?70

?71

?72

?73

?74

?75

?76

?77

?78

?79

?80

?81

?82

?83

?84

?85

?86

?87

?88

?89

?90

?91

?92

?93

?94

?95

?96

?97

?98

?99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126



127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142



143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160



161

162

163

164

165

166

167

168

169

170

171



172

173

174

175

176

177

178

179

180

181

182

183

184

185

186



187

188

189

190

191

192


193



194

195



196

197



198

199

200

201

202

203


204

205

206

207

208



209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226



227

228

229



230



231

232

233

234

235

236



237

238

239



240

241

242

243



244

245

246

247



248

249

250

251



252



253

254

255

256

257

258

259

260

261

262

地震讓大伙知道:居安思危,才是生存之道。
