1.创建一个窗口程序(Fame ),标题栏起名为“湖龙路”,有一个来单条,有文件”
“编辑”查看”3个菜单。“文件”菜单有两个菜单项一项是中开道项是
“保存”,“打开”项做成子菜单,有两个菜单项“打开X和“打开Y“保存项就是
芒通的菜单项。“编辑”菜单就一个菜单项“复制”。“查看”有两个菜单项一停止和
“刷新”。在菜单及菜单项上添加合适的快捷键。
上边的题目是从图片中提取的文字,有错也就凑合着看吧,下边代码也不是完全照题目做的
代码:
package week11;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
public class GUITest {
public static void main(String[] args){
MyJFrame myJFrame = new MyJFrame();
myJFrame.setTitle("浏览器");
myJFrame.setBounds(100, 100, 750, 450);
myJFrame.setVisible(true);
}
}
class MyJFrame extends JFrame implements MenuListener, ActionListener{
JMenuBar menuBar;
JMenu menuFile,menuEdit,menuLook,subMenuOpen,menuClear;
JMenuItem menuItemSave,menuItemOpenX,menuItemOpenY,
menuItemCopy,menuItemStop,menuItemRefresh;
JTextArea showTextArea;//文本区域,用来显示多行文本
/*
* 1.String的对象是不可变的;而StringBuilder和StringBuffer是可变的。
* 2.StringBuilder不是线程安全的;而StringBuffer是线程安全的
* 3.String中的offset,value,count都是被final修饰的不可修改的;
* 而StringBuffer和StringBuilder中的value,count都是继承自AbstractStringBuilder类的,
* 没有被final修饰,说明他们在运行期间是可修改的,而且没有offset变量。
*/
StringBuffer str = new StringBuffer("注意:按下Alt或者点击一个菜单后菜单栏上的菜单事可以滑动选择的,"
+ "这样就造成鼠标滑动时文本区域输出大量数据\n");//定义一个可变字符串用来不断获取以及更改文本区域内容
public MyJFrame() {
/////////////创建菜单栏和一级菜单///////////////
menuBar = new JMenuBar();
menuFile = new JMenu("文件(F)");
menuEdit = new JMenu("编辑(E)");
menuLook = new JMenu("查看(L)");
subMenuOpen = new JMenu("打开");
menuClear = new JMenu("清空文本区域(D)");
//////////////////创建菜单项/////////////////
menuItemOpenX = new JMenuItem("打开X");
menuItemOpenY = new JMenuItem("打开Y");
menuItemSave = new JMenuItem("保存");
menuItemCopy = new JMenuItem("复制");
menuItemStop = new JMenuItem("停止");
menuItemRefresh = new JMenuItem("刷新");
/*
* JMenuItem的点击事件
* Ctrl+S可以触发,Ctrl+C没有被触发
*/
menuItemOpenX.addActionListener(this);
menuItemOpenY.addActionListener(this);
menuItemSave.addActionListener(this);
menuItemCopy.addActionListener(this);
menuItemStop.addActionListener(this);
menuItemRefresh.addActionListener(this);
////////////////创建文本区域/////////////////
/*
* 这里15,30的话不需要滚动条,所以滚动条自动隐藏,看效果直接指定为150,500
*/
showTextArea = new JTextArea(15,60);
showTextArea.setText(str.toString());
add(new JScrollPane(showTextArea));//将文本区域放入一个滚动布局中
////////////////设置快捷键//////////////////
menuFile.setMnemonic('F');//文件(F)
menuItemSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));//保存 Ctrl+S
//subMenu不设置快捷键
menuEdit.setMnemonic('E');//编辑(E)
menuItemCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));//复制 Ctrl+C
menuLook.setMnemonic('L');//查看(L)
menuClear.setMnemonic('D');//清空文本区域(D)
///////////////设置事件////////////////////
/*
* 这里直接用匿名内部类的方式来写的,比较常见的有三种方法,第两种在下边,第三种参考课本
* JMenu本身没有点击触发事件!!!!
*/
menuFile.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent e) {
// 选择某个菜单时调用
str = str.append("选择了文件菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
}
@Override
public void menuDeselected(MenuEvent e) {
// 取消选择某个菜单时调用
}
@Override
public void menuCanceled(MenuEvent e) {
// 取消菜单时调用
}
});
//事件的第二中种实现方式
menuClear.addMenuListener(this);
menuEdit.addMenuListener(this);
menuLook.addMenuListener(this);
/////////////将菜单项设置到菜单中/////////////
subMenuOpen.add(menuItemOpenX);
subMenuOpen.add(menuItemOpenY);
menuFile.add(menuItemSave);
menuFile.add(subMenuOpen);
menuEdit.add(menuItemCopy);
menuLook.add(menuItemStop);
menuLook.add(menuItemRefresh);
////////////将菜单设置到菜单栏///////////////
menuBar.add(menuFile);
menuBar.add(menuEdit);
menuBar.add(menuLook);
menuBar.add(menuClear);
////////////将菜单栏设置到窗口//////////////
setJMenuBar(menuBar);
}
//////////JMenu菜单事件的第二种实现方法///////////
/*
* 通过实现了MenuListener接口的方式
* 下边是e.toString()后的结果,说白了就是想实验一下e能不能分辨是哪一个JMenu,结果发现了Text这个属性,那么后面的事就好办了
* javax.swing.event.MenuEvent[source=javax.swing.JMenu[,0,0,53x23,alignmentX=0.0,
* alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@56a1fd57,
* flags=384,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,
* disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],
* paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,
* rolloverSelectedIcon=,selectedIcon=,text=文件(F)]]
*/
@Override
public void menuSelected(MenuEvent e) {
// TODO Auto-generated method stub
String eString = e.toString();
int index = eString.indexOf("text=");//这里是字符串的匹配
String textStr = eString.substring(index+5, index+7);//只获取Text=后边的两个汉字
int tap = 0;//标识是哪个JMenu
if ("编辑".equals(textStr)) {
tap = 2;
}else if("查看".equals(textStr)){
tap = 3;
}else if("清空".equals(textStr)){
tap = 4;
}
switch (tap) {
case 2:
str = str.append("选择了编辑菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 3:
str = str.append("选择了查看菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 4:
str = new StringBuffer("");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
default:
str = str.append("程序出问题了!\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
}
}
//JMenuItem的点击事件
@Override
public void menuDeselected(MenuEvent e) {
// TODO Auto-generated method stub
}
@Override
public void menuCanceled(MenuEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String eString = e.toString();
int index = eString.indexOf("text=");//这里是字符串的匹配
String textStr = eString.substring(index+5, eString.length());//只获取Text=后边全部,全部
//因为截取两个不能分辨打开X还是打开Y两个菜单,截取三个复制、停止、刷新又不够三个字符了,所以只能用indexOf()了
int tap = 0;//标识是哪个JMenu
if (textStr.indexOf("打开X")!=-1) {
tap = 2;
}else if(textStr.indexOf("打开Y")!=-1){
tap = 3;
}else if(textStr.indexOf("复制")!=-1){
tap = 4;
}else if(textStr.indexOf("停止")!=-1){
tap = 5;
}else if(textStr.indexOf("刷新")!=-1){
tap = 6;
}else if(textStr.indexOf("保存")!=-1){
tap = 7;
}
switch (tap) {
case 2:
str = str.append("选择了打开X菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 3:
str = str.append("选择了打开Y菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 4:
str = str.append("选择了复制菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 5:
str = str.append("选择了停止菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 6:
str = str.append("选择了刷新菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
case 7:
str = str.append("选择了保存菜单\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
default:
str = str.append("程序出问题了!\n");//String转换为StringBuffer
showTextArea.setText(str.toString());//StringBuffer转换为String
break;
}
}
}
- 1
- 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
总结:
1.首先明白了JMenu是没有点击事件的,JMenuItem有点急事件
2.其次当有多个JMenu和JMenuItem需要设置事件的时候用类实现某个接口的方法 判断具体是哪个组件的事件时比较费事,本来以为跟android里的差不多可以通过类 似组件id之类的方法很方便的判断的,结果并没有找到系统事先定义好的判断方法,这里用的是字符串的截取,当然也可能会有更好的办法只是没接触过。
3.事件类比android也可以有三种实现方式,写了两种,第三种在书上
4.代码中用到了可变字符串和字符串的截取操作,百度很多
5.复制Ctrl+C的快捷键并没有触发相应的操作,具体的原因没有去细看,Ctrl+S实现了
6.相对第九章的GUI重要程度应该没有第八章的String高
上边的第二种实现方式判断是哪个组件的时候又是截取又是对比的都是自己瞎想的,虽然运行效果一样但还是按套路来的好,具体套路看下边,写的时候发现有个getID()方法以为跟android通过ID判断控件一样来着,结果测试,并不是,其次TextArea组件本身就有append方法根本用不着定义可变字符串,不看课本闷头写代码的悲哀啊,根本没注意这几个方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource()==mJRadioButton_man) {
if (mJRadioButton_man.isSelected()) {
//这里两条语句效果一样
mJTextArea.append(mJRadioButton_man.getText()+"\n");
// mJTextArea.append(mJRadioButton_man.getActionCommand()+"\n");
}
}else if (e.getSource()==mJRadioButton_woman) {
if (mJRadioButton_woman.isSelected()) {
mJTextArea.append(mJRadioButton_woman.getText()+"\n");
}
}else if (e.getSource()==mJCheckBox_yuMaoQiu) {
if (mJCheckBox_yuMaoQiu.isSelected()) {
mJTextArea.append(mJCheckBox_yuMaoQiu.getText()+"\n");
}
}else if (e.getSource()==mJCheckBox_pingPangQiu) {
if (mJCheckBox_pingPangQiu.isSelected()) {
mJTextArea.append(mJCheckBox_pingPangQiu.getText()+"\n");
}
}else if (e.getSource()==mJCheckBox_changGe) {
if (mJCheckBox_changGe.isSelected()) {
mJTextArea.append(mJCheckBox_changGe.getText()+"\n");
}
}
}