一、java GUI:图形用户接口,基于windows的应用程序。java分为AWT、SWING。
1、AWT 抽象窗口化工具包
2、SWING 界面
二、java提供丰富的UI组件类
1、java GUI界面的分层结构如下:
2、第一层(顶层容器,java独立的界面,必须有一个顶层容器。自带一个Content Pane):JFrame、JDialog
1)JFrame类:窗口有最大化、最小化按钮
2)JDialog类:窗口没有最大化、最小化按钮3、第二层:JPanel、JTabbedPane、JMenuBar
1)JPanel类(组件):相当于次级容器
2)JTabbedPane:选项卡面板,相当于几个页面的集合,使用选项卡实现页面切换。步骤:
a. 实例化 JTabbedPane
b. 设计选项卡对应的界面,每个界面可以是一个JPanel
c. 使用add方法 将每个选项卡添加到JTabbedPane中,代码:
public class JTabbedDemo extends JFrame{
JTabbedPane jtp;
JPanel jp1,jp2,jp3;
public JTabbedDemo()
{
setVisible(true);setSize(400,400);setTitle("选项卡面板");
jp1=new JPanel();
JLabel jl1=new JLabel("第一个界面");
jp1.add(jl1);
jp2=new JPanel();
jp3=new JPanel();
jtp=new JTabbedPane(JTabbedPane.BOTTOM);//指定选项卡的位置
jtp.add("添加用户",jp1);//选项卡的标题,选项卡对应的界面
jtp.add("修改用户",jp2);
jtp.add("管理员界面",jp3);
add(jtp);
}
public static void main(String[] args) {
new JTabbedDemo();
}
}
3)JMenuBar菜单栏:与JPanel同级别,添加到JFrame中。
JMenu 菜单
JMenuItem菜单项
代码如下:public class JMenuBarDemo extends JFrame{
JMenuBar MenuBar;
JMenu file,edit,format,view,help;
JMenuItem add,open,save;
public JMenuBarDemo(){
setVisible(true);
setSize(400,400);
setTitle("记事本");
setDefaultCloseOperation(EXIT_ON_CLOSE);
MenuBar=new JMenuBar();
file=new JMenu("文件");
edit=new JMenu("编辑");
format=new JMenu("格式");
view=new JMenu("查看");
help=new JMenu("帮助");
MenuBar.add(file);MenuBar.add(edit);MenuBar.add(format);MenuBar.add(view);MenuBar.add(help);
add=new JMenuItem("新增");
open=new JMenuItem("打开");
save=new JMenuItem("保存");
file.add(add);
file.addSeparator();//<span style="color:#FF0000;">添加分割线</span>
file.add(open);
file.add(save);
setJMenuBar(MenuBar);//<span style="color:#FF0000;">将菜单栏添加到JFrame中</span>,使用这个方法才能显示为菜单形式
}
public static void main(String[] args) {
new JMenuBarDemo();
}
}
4、第三层:JScrollPane:滚动条,与JPanel同级别。带滚动条的JPanel。用法:
JScrollPane jsp;
jsp=new JScrollPane(jta);//jta代表想要设置滚动条的控件
jp.add(jsp);//设置后jta就会增加纵向的滚动条
5、第四层:其他组件类:都继承了JComponent类
1)JLable类:显示文字,不能输入
2)JTextField类:文本域,可输入
3)JButton类:按钮'
4)JPasswordField类:密码输入框,文字被隐形显示
5)JRadioButton类:单选按钮,实现单选需要和ButtonGroup一起使用
6)JCheckBox类:复选框
7)JComboBox类:下拉框
代码和实例如下:
//JFrame-->JPanel-->其他组件
public class FirstJPanel extends JFrame{
JPanel jp;
JLabel lbName,lbpassword,lbGender,lbzffs,lbcentry;
JTextField txName;
JPasswordField fPassword;
JRadioButton rbMan,rbWoman;
ButtonGroup btGroup;
JCheckBox zfb,wx,yhk;
JComboBox cbxCenter;
JButton btnRegin,btnCancel;
//实例化组件类
public void addComponent(){//创建控件,封装
jp=new JPanel();
lbName=new JLabel("姓名");
lbpassword=new JLabel("密码");
txName=new JTextField(100);//设置文本域显示数据的长度
fPassword=new JPasswordField();
lbGender=new JLabel("性别");
rbMan=new JRadioButton("男");
rbWoman=new JRadioButton("女");
btGroup=new ButtonGroup();
zfb=new JCheckBox("支付宝");
wx=new JCheckBox("微信");
yhk=new JCheckBox("银行卡");
lbzffs=new JLabel("支付");
lbcentry=new JLabel("城市");
cbxCenter=new JComboBox();
cbxCenter.addItem("成都");
cbxCenter.addItem("贵阳");
cbxCenter.addItem("重庆");
btnRegin=new JButton("注册");
btnCancel=new JButton("取消");
}
//设置组件的坐标,并添加到父容器
public void setComponent(){
setVisible(true);
setSize(400,400);
jp.setLayout(null);//清空父容器的布局
jp.setBackground(Color.blue);
add(jp);
lbName.setBounds(50, 30, 50, 30);
jp.add(lbName);
txName.setBounds(100, 30, 110, 30);
jp.add(txName);
lbpassword.setBounds(50, 80, 50, 30);
jp.add(lbpassword);
fPassword.setBounds(100, 80, 110, 30);
jp.add(fPassword);
lbGender.setBounds(50, 130, 50, 30);
jp.add(lbGender);
//将单选按钮指定为一组,实现单选
btGroup.add(rbMan);
rbMan.setBounds(100, 130, 50, 30);
jp.add(rbMan);
btGroup.add(rbWoman);
rbWoman.setBounds(160, 130, 50, 30);
jp.add(rbWoman);
lbzffs.setBounds(50, 180, 50, 30);
jp.add(lbzffs);
zfb.setBounds(100, 180, 65, 30);
jp.add(zfb);
wx.setBounds(170, 180, 65, 30);
jp.add(wx);
yhk.setBounds(240, 180, 65, 30);
jp.add(yhk);
lbcentry.setBounds(50, 230, 50, 30);
jp.add(lbcentry);
cbxCenter.setBounds(100, 230, 80, 30);
jp.add(cbxCenter);
btnRegin.setBounds(100, 280, 80, 30);
jp.add(btnRegin);
btnCancel.setBounds(200, 280, 80, 30);
jp.add(btnCancel);
}
public static void main(String[] args) {
FirstJPanel p=new FirstJPanel();
p.addComponent();
p.setComponent();
}
}
运行后的界面:
8)JTextArea:文本域,复数行文本框,默认情况下不会换行,用法:
JPanel jp;
JTextArea jta;
jta=new JTextArea(10,10);//设置界面显示的行列
jta.setLineWrap(true);//<span style="color:#FF0000;">设置换行</span>
jta.setWrapStyleWord(true);//<span style="color:#FF0000;">设置单词换行</span>
jp.add(jta);
add(jp);
9)JOptionPane:对话框,包含消息对话框、确认对话框、输入对话框。用法可参考代码:
public class jOptionPaneDemo extends JFrame {
JPanel jp;
JButton btnConfirm,btnInput,btnMessage;
public jOptionPaneDemo()
{
setVisible(true);
setSize(400,400);
setTitle("对话框");
jp=new JPanel();
btnMessage=new JButton("消息对话框");
//实现按钮的事件处理程序
btnMessage.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//在这里写单击按钮 要做的事情
JOptionPane.showMessageDialog(getParent(), "JOptionPane对话框示例");//第一个参数指明对话框所处的父容器,第二个参数表示要显示的消息
JOptionPane.showMessageDialog(getParent(), "JOptionPane对话框示例","自定义标题",JOptionPane.WARNING_MESSAGE);//警告对话框
}});
btnConfirm=new JButton("确认对话框");
btnConfirm.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//确认对话框,含有Y/N,对话框中默认3个按钮:是、否、取消
JOptionPane.showConfirmDialog(getParent(), "Are you OK?");
JOptionPane.showConfirmDialog(getParent(), "Are you OK?","自定义标题",JOptionPane.YES_NO_OPTION,JOptionPane.ERROR_MESSAGE);
}});
btnInput=new JButton("输入对话框");
btnInput.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JOptionPane.showInputDialog("请输入姓名");
}});
jp.add(btnMessage);
jp.add(btnConfirm);
jp.add(btnInput);
add(jp);
}
public static void main(String[] args) {
new jOptionPaneDemo();
}
}
10)JTable组件:表格结构,以列表形式显示数据。用法可参考代码:
public class JTableDemo extends JFrame{
JPanel jp;
JTable table;
public JTableDemo(){
setVisible(true);
setSize(400,400);
setTitle("BoxLayout");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//表格标题的数组
String[] columns={"学号","姓名","年龄","专业"};
//数据的数组
String[][] Data={{"1001","小舟","20","美术"},
{"1003","小李","18","音乐"},
{"1003","小兴","21","写作"}};
table =new JTable(Data,columns);//使用数组实例化JTable
//滚动面板
JScrollPane scrollPane=new JScrollPane(table);
jp=new JPanel();
add(jp);
jp.add(scrollPane);
}
public static void main(String[] args) {
new JTableDemo();
}
}
11)DataModel:界面和数据间的中介,自定义向Table中放入数据的格式,如图片。继承AbstractTableModel 或者DefaultTableModel。用法可参考代码:
public class DataModelDemo extends JFrame{
JPanel jp;
JTable table;
myDataModel model;
public DataModelDemo(){
setVisible(true);
setSize(400,400);
setTitle("BoxLayout");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//表格标题的数组
String[] columns={"照片","学号","姓名","年龄","专业"};
//项目的项目路径 ./代表项目名称
ImageIcon img1=new ImageIcon(".src/Images/20101029.jpg");//括号里写图片的路径
//数据的数组,Object类是java中所有类的父类,Object数组可以写任何类型
Object[][] Data={{img1,"1001","小舟","20","美术"},
{img1,"1003","小李","18","音乐"},
{img1,"1003","小兴","21","写作"}};
model=new myDataModel(Data,columns);
//自定义数据格式
table =new JTable(model);
table.setRowHeight(100);//设置行高
//滚动面板
JScrollPane scrollPane=new JScrollPane(table);
jp=new JPanel();
add(jp);
jp.add(scrollPane);
}
class myDataModel extends DefaultTableModel
{
public myDataModel(Object[] names,int row){
super(names,row);
}
//为了在创建myDataModel的类时将Data和name传到类中
public myDataModel(Object[][] data,Object[] names){
super(data,names);
}
//getClass()返回某一列的类的类型,写了之后就可以在表格里面可以返回任何类型的数据
public Class<?>getColumnClass(int col){
Vector<?> v=(Vector<?>) dataVector.elementAt(0);
return v.elementAt(col).getClass();
}
}
public static void main(String[] args) {
new DataModelDemo();
}
}
其中特殊方法: 指定界面默认关闭选项,EXIT_ON_CLOSE为关闭时退出程序:
setDefaultCloseOperation(EXIT_ON_CLOSE);