@w460461339
2016-11-16T07:10:00.000000Z
字数 8502
阅读 935
Java基础
今天终于可以告别无聊的控制台,也不用像C/C++那样看小黑屏了,我们可以利用GUI(Graphical User Interface)来制作图形界面了!
GUI:
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
所依赖的包:
java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
因为swing包下的图形界面是用Java实现的,所以用它会有比较高的可移植性,用它比较好。
GUI集成体系图
图中container是容器类,我们目前使用Frame比较多。右边主要是功能按钮类(忘记怎么描述了),是往容器中添加,并实现某个功能用的。
由于方法太对,没办法一个个的学习过来,这里就简单说一些功能。
package GUI_01;
import java.awt.Frame;
public class FrameDemo {
public static void main(String[] args) {
//创建Frame对象(就是窗口)
Frame fr=new Frame();
//设置窗口名字,也可以在创建的时候给
fr.setTitle("helloWorld");
//设置窗口大小
fr.setSize(300, 400);
//设置窗口初始位置
fr.setLocation(100, 200);
//令窗口可视。
fr.setVisible(true);
}
}
但这个时候我们发下我们没办法用单击 x 的方式将窗口关掉,只能用停止程序的方式,因此,就需要下面的知识了~!
(宝宝快来呀…下雪天好冷的~)
方法一
package GUI_01;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class FrameDemo {
public static void main(String[] args) {
Frame fr=new Frame();
fr.setTitle("helloWorld");
// fr.setSize(300, 400);
// fr.setLocation(100, 200);
//效果和直接上面两句话合在一起一样
fr.setBounds(100, 200, 300, 400);
//匿名内部类实现windowsListener接口
//需要实现每个方法,太麻烦= -
fr.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
fr.setVisible(true);
}
}
方法二
package GUI_01;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class FrameDemo {
public static void main(String[] args) {
Frame fr=new Frame();
fr.setTitle("helloWorld");
fr.setBounds(100, 200, 300, 400);
//利用适配器。
//适配器对接口中所有方法空实现
//之后只要继承适配器,重写所需要的方法就可以了。
fr.addWindowListener(new WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e)
{
System.exit(0);
};
}
);
fr.setVisible(true);
}
}
所以,有适配器的情况下,还是请使用适配器会比较好。
package GUI_01;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
/**
* 需求:
* 往窗口中添加按钮。
* 并设置按钮的移入事件,更改背景颜色
* 设置单击事件,回复背景颜色。
*/
public class ButtonDemo {
public static void main(String[] args) {
//创建窗口
final Frame fr=new Frame("按钮测试");
//设置窗口参数
fr.setBounds(200, 300, 400, 300);
//设置窗口布局
fr.setLayout(new FlowLayout());
//创建按钮
Button bu1=new Button();
bu1.setLabel("红色");
Button bu2=new Button();
bu2.setLabel("绿色");
Button bu3=new Button();
bu3.setLabel("复原");
//添加按钮
fr.add(bu1);
fr.add(bu2);
fr.add(bu3);
//添加对按钮的鼠标进入事件
//所以用的是鼠标监听器,添加鼠标适配器
bu1.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
fr.setBackground(Color.RED);
}
});
bu2.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
fr.setBackground(Color.GREEN);
}
});
//添加对按钮本身的事件监听
//所以添加的是对按钮本身的监听器
bu3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fr.setBackground(Color.WHITE);
}
});
//设置窗口关闭
fr.addWindowListener(new WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e)
{
System.exit(0);
};
}
);
//设置窗口可见
fr.setVisible(true);
}
}
这里需要注意,对鼠标的动作监听,就需要调用方法,添加鼠标适配器(addMouseListener(new MouseAdapter));对按下按钮本身而言,是按钮发生了变化,因此需要对鼠标本身做监听。
这里另外解释下addActionListener以及其中创建的ActionListener 对象。
它用于监听组件的特定动作。比如对于按钮就是被按下,对于下拉条就是被滑动等等。就是这个用于监听这个时间发生与否。这与鼠标事件明确是进入还是离开有点不一样,它是默认的,所以在此特别说明。
package GUI_01;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 需求:
* 在文本框中输入任意字符;
* 单击按钮;
* 将文本框中内容转入文本域
* 下一次时添加在末尾。
*/
public class TextDemo {
public static void main(String[] args) {
//创建窗口
Frame fr=new Frame("文本框文本域转换");
//设置窗口属性
fr.setBounds(200, 300, 400, 300);
//设置窗口布局
fr.setLayout(new FlowLayout());
//创建文本框,可以输入1行(默认一行),20列
final TextField tf=new TextField(20);
//创建文本域,可以输入20行,40列
final TextArea ta=new TextArea(20, 40);
//创建按钮
Button bu=new Button("转换");
//添加组件
fr.add(tf);
fr.add(bu);
fr.add(ta);
//对按钮添加事件
bu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取文本框中内容
String tfstr=tf.getText();
//往文本域中追加内容
ta.append(tfstr+"\r\n");
//清空文本框
tf.setText("");
//给文本框光标
tf.requestFocus();
}
});
//添加窗口关闭事件
fr.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//显示窗口
fr.setVisible(true);
}
}
这里首相要明确各级包含顺序:
最大的是菜单条(MenuBar),就是菜单背景那个灰色的区域,它只能包含菜单;
其次是菜单(Menu),就是文件,编辑之类的,点开之后又下拉内容的,它能包含菜单和菜单项。
最小的是菜单项(MenuItem),就是点开菜单,并且之后没有进一级内容的选项。
package GUI_01;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
/**
* 需求:
* 创建多级菜单
* 预先知识:
* 先创立菜单条(灰色的背景部分)
* 在创立菜单(上面的文件,编辑之类的)
* 最后创立菜单项(每个菜单的下拉列表)
*
*/
public class MenuDemo {
public static void main(String[] args) {
//最后一遍联系窗口的创建以及关闭
//创建窗口
Frame fr=new Frame("多级菜单");
//设置窗口参数
fr.setBounds(200, 300, 300, 400);
//设置布局
fr.setLayout(new FlowLayout());
//创建菜单条
MenuBar mb=new MenuBar();
//创建菜单
Menu me1=new Menu("文件");
Menu me2=new Menu("编辑");
//这个菜单在文件菜单下
Menu me3=new Menu("新建");
//创建菜单项
MenuItem mi1=new MenuItem(".txt");
MenuItem mi2=new MenuItem(".doc");
MenuItem mi3=new MenuItem("Quit");
MenuItem mi4=new MenuItem("CopyALL");
MenuItem mi5=new MenuItem("DeleAll");
//往菜单中添加菜单项
//往“新建”菜单中添加菜单项
me3.add(mi1);
me3.add(mi2);
//往“文件”菜单中添加菜单和菜单项
me1.add(me3);
me1.add(mi3);
//往“编辑”菜单中添加菜单项
me2.add(mi4);
me2.add(mi5);
//往菜单条中添加菜单
mb.add(me1);
mb.add(me2);
//窗口中添加菜单条
fr.setMenuBar(mb);
//添加点击.txt打开记事本事件
mi1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Runtime.getRuntime().exec("notepad");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
//添加点击QUIT关闭事件
mi3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
//添加点击X关闭事件
fr.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//设置窗口可见
fr.setVisible(true);
}
}
说明:
1、由于在Java中排版比较困难,所以这里不用Label了。想要好的排版,请用NetBeans
2、目前只是简单版本,还没有进行数据校验,运算规则校验,小数运算等等内容。
3、同时,更改图标功能也没有完成= -
package _GUI_01;
import java.awt.Button;
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.List;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
public class CalculatorDemo {
public static void main(String[] args) {
//创建窗口
final Frame fr=new Frame("按钮测试");
//设置窗口参数
fr.setBounds(200, 300, 400, 300);
//设置窗口布局
fr.setLayout(new FlowLayout());
//创建标签
Label firstLabel=new Label("FirstNumber");
Label secondLabel=new Label("SecondNumber");
Label resultLabel=new Label("resultNumber");
Label equals=new Label("=");
//创建文本框
final TextField firstNumber=new TextField();
final TextField secondNumber=new TextField();
final TextField result=new TextField();
//创建下拉框,测试后,这里用Choice,不用List
final Choice ch=new Choice();
ch.add("+");
ch.add("-");
ch.add("*");
ch.add("/");
//创建按钮
Button bu=new Button();
bu.setLabel("计算");
// //添加标签
// fr.add(firstLabel);
// fr.add(secondLabel);
// fr.add(resultLabel);
//添加文本框
fr.add(firstNumber);
//添加Choice
fr.add(ch);
//添加文本框
fr.add(secondNumber);
//添加标签
fr.add(equals);
//添加文本框
fr.add(result);
//添加按钮
fr.add(bu);
bu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取第一个和第二个运算数
String first=firstNumber.getText();
int thefirstNumber=Integer.parseInt(first);
String second=secondNumber.getText();
int thesecondNumber=Integer.parseInt(second);
int sum=0;
//由于是JDK1.6,不能直接判断字符串,只能判断索引
switch(ch.getSelectedIndex()){
case 0:
sum=thefirstNumber+thesecondNumber;
result.setText(Integer.toString(sum));
break;
case 1:
sum=thefirstNumber-thesecondNumber;
result.setText(Integer.toString(sum));
break;
case 2:
sum=thefirstNumber*thesecondNumber;
result.setText(Integer.toString(sum));
break;
case 3:
sum=thefirstNumber/thesecondNumber;
result.setText(Integer.toString(sum));
break;
}
}
});
//设置窗口关闭
fr.addWindowListener(new WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e)
{
System.exit(0);
};
}
);
//设置窗口可见
fr.setVisible(true);
}
}