菜单篇之~~老外杰作~~~~~~~~~~~~~~~~~注释完成
写得很有条理啊 呵呵
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
地震让大伙知道:居安思危,才是生存之道。