GUI介绍(一)常见的组件及简单监听器
- 第一个窗口程序
- 容器控件
- JLabel控件
- 简单事件处理
- 文本框JTextFiled
- 复选框JCheckBox
- 下拉列表JComboBox
- 布局管理器LayoutManager
- 边界布局管理器BorderLayout
- 手工布局
 
前段时间学了GUI,总体上概念还是有点模糊,于是决定花点时间简单整理下。先简单介绍一下GUI,GUI就是图形用户界面。
Java提供了GUI相关的两个API:分别是AWT、Swing。
AWT是最早提供的GUI库,依赖本地平台,界面不好看,功能有限。之后推出了Swing,Swing并没有完全替代AWT,而是建立在AWT的拓展,是轻量级的界面设计库。
废话不多说,开始上代码!
第一个窗口程序
	public class MyDemo {public static void main(String[] args) {//JFrame指一个窗口JFrame frame=new JFrame("窗口案例");//关闭窗口时退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//调整窗口大小frame.setSize(400,300);//显示窗口(放到程序后面,否则窗口可能显示不出来)frame.setVisible(true);}}
因为这个窗口啥也没有,效果就是这样式的
 
容器控件
当我们需要在窗口里边添加控件时,我们用到JPanel和JButton 其中JPanel表示一个容器,也称为面板。
JButton表示一个按钮控件 我们需要向窗口里边添加一个容器JPanel,然后在向容器内添加控件 ,还是刚刚MyDemo类,我们添加如下代码。
		//创建一个面板JPanel panel=new JPanel();//将面板添加到窗口中frame.setContentPane(panel);//添加按钮JButton button=new JButton("测试");panel.add(button);这时就有了一个按钮组件了
 
JLabel控件
JLabel是标签控件,显示单行文本,其中相关的方法可见代码中的注释。
//继续在MyDemo类添加
JLabel label=new JLabel("java 你好!");
panel.add(label);

 常见的方法测试如下
public class MyFrame extends JFrame{public MyFrame(String title) {super(title);//创建一个面板JPanel panel=new JPanel();//将面板添加到窗口中this.setContentPane(panel);//添加按钮JButton button=new JButton("测试");panel.add(button);JLabel label=new JLabel("JLabel标签测试");//设置字体label.setFont(new Font("微软雅黑",Font.PLAIN,14));//设置文字颜色label.setForeground(new Color(100,200,50));//设置背景色label.setOpaque(true);//背景色默认透明显示,设置不透明label.setBackground(new Color(100,30,100));//设置控件大小label.setPreferredSize(new Dimension(150, 30));//Dimension指定高度、宽度//设置文本居中对齐label.setHorizontalAlignment(SwingConstants.CENTER);panel.add(label);}
}
(ps:这里写了一个Myframe类继承Frame类,主要写控件的操作,下面的如果没有特别提示的话都是在Myframe类里面写的!)
简单事件处理
事件处理使用的是监听机制
步骤:
1、添加一个监听器类,实现ActionListener接口
2、设置监听器>
3、将监听器对象传给控件
Main方法所在的类如下
public class MyDemo {public static void main(String[] args) {//JFrame指一个窗口MyFrame frame=new MyFrame("窗口测试");//关闭窗口时退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		//调整窗口大小frame.setSize(400,300);//显示窗口(放到程序后面,否则窗口可能显示不出来)frame.setVisible(true);}
}监听事件所在的类
public class MyFrame extends JFrame{public MyFrame(String title) {super(title);//创建一个面板JPanel panel=new JPanel();//将面板添加到窗口中this.setContentPane(panel);//添加按钮JButton button=new JButton("测试");button.addActionListener(new MyactionListener());panel.add(button);JLabel label=new JLabel("java 你好!");panel.add(label);}private class MyactionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮被点击了!");				}			}
}当点击按钮时,触发监听事件,控制台输出如下

 练习:点击按钮,获取当前时间(使用SimpleDateFormat类获取当前时间)
public class MyFrame extends JFrame {JLabel timeJLabel = new JLabel("00:00:00");// 作为Myframe的属性,使内部类能够访问public MyFrame(String title) {super(title);// 创建一个面板JPanel panel = new JPanel();// 将面板添加到窗口中this.setContentPane(panel);// 添加按钮JButton button = new JButton("测试");button.addActionListener(new MyactionListener());panel.add(button);panel.add(timeJLabel);}private class MyactionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {SimpleDateFormat sdf = new SimpleDateFormat("HH:MM:SS");String str = sdf.format(new Date());// 获取当前时间转化位字符串timeJLabel.setText(str);}}
}效果如下
 
文本框JTextFiled
JTextFiled的相关的两个方法是setText(str)和getText()
添加监听事件,实现内容输出
public class MyFrame extends JFrame {JTextField jField = new JTextField(20);JButton button = new JButton("点我");JTextField jField2 = new JTextField(20);public MyFrame(String title) {super(title);// 创建一个面板JPanel panel = new JPanel();// 将面板添加到窗口中this.setContentPane(panel);jField.setText("我是一个文本框");button.addActionListener(new ButtonActionListener());panel.add(jField);panel.add(button);panel.add(jField2);}public class ButtonActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {test();}}public void test() {String str = jField.getText();jField2.setText(str);}
}效果如下
 
复选框JCheckBox
JCheckBox相关的方法
setSelected(true/false)设置选中状态
isSelect()是否选中
addActionListener()勾选或取消获取事件
public class MyFrame extends JFrame {JCheckBox agreeBox = new JCheckBox("同意用户协议");JCheckBox agreeBox1 = new JCheckBox("取消");JButton nextButton = new JButton("下一步");public MyFrame(String title) {super(title);// 创建一个面板JPanel panel = new JPanel();// 将面板添加到窗口中this.setContentPane(panel);panel.add(agreeBox);panel.add(agreeBox1);panel.add(nextButton);}
}效果如下
 
 练习:添加功能,当复选框没有选择时,默认按钮是不可选的,既无法进行下一步操作,当选中“同意用户协议后“,会弹出对话信息框。
public class MyFrame extends JFrame {JCheckBox agreeBox = new JCheckBox("同意用户协议");JCheckBox agreeBox1 = new JCheckBox("取消");JButton nextButton = new JButton("下一步");JPanel panel = new JPanel();public MyFrame(String title) {super(title);// 将面板添加到窗口中this.setContentPane(panel);panel.add(agreeBox);panel.add(agreeBox1);panel.add(nextButton);// 界面初始化nextButton.setEnabled(false);// 给CheckBox添加事件处理agreeBox.addActionListener(new CheckBoxListener());nextButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(panel, "欢迎!");}});}public class CheckBoxListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {if (agreeBox.isSelected()) {nextButton.setEnabled(true);} elsenextButton.setEnabled(false);}}
}效果如下
 点击前
 
 点击后
 
下拉列表JComboBox
JComboBox colorFiled=new JComboBox<>();
JComboBox是一个泛型,参数类型T表示的是数据项的类型
数据项
addItem() 添加数据项
getItemCount()获取数据项个数
getItemAt(index)获取数据项
按索引访问
getSelectedIndex()获取选中项的索引
setSelectedIndex()设置选中项
remove(index)删除索引
按数据项访问
getSelectedItem() 获取数据项
setSelectedItem()设置数据项
remove(item)删除
public class MyFrame extends JFrame{JComboBox<String> colorBox=new JComboBox<String>();public MyFrame(String title) {super(title);//创建一个面板JPanel panel=new JPanel();//将面板添加到窗口中this.setContentPane(panel);//下拉列表	colorBox.addItem("红色");colorBox.addItem("绿色");colorBox.addItem("蓝色");panel.add(colorBox);//测试按钮JButton testButton=new JButton("测试");panel.add(testButton);testButton.addActionListener(new testButtonListener());}public class testButtonListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {test();}}public void test() {//获取个数Object a=colorBox.getSelectedItem();int count=colorBox.getItemCount();String value=colorBox.getItemAt(0);System.out.println("数据项个数:"+count+"索引值:"+value);System.out.println(a);}
}控制台输出
 
布局管理器LayoutManager
当把控件添加到窗口后,由布局管理器对每一个子控件进行布局。
默认JPanel自带一个FlowLayout流式布局器,就是流水线一样从左到右,从上到下进行布局。
边界布局管理器BorderLayout
BorderLayout将容器分为东、西、南、北、中5个区域,然后每个区域来放置子控件
public class MyFrame extends JFrame{public MyFrame(String title) {super(title);//创建一个面板JPanel panel=new JPanel();//将面板添加到窗口中this.setContentPane(panel);//设置布局器BorderLayout borderLayout=new BorderLayout();panel.setLayout(borderLayout);ColorLabel cLabel1=new ColorLabel("东", Color.YELLOW);ColorLabel cLabel2=new ColorLabel("南", Color.GREEN);ColorLabel cLabel3=new ColorLabel("西", Color.LIGHT_GRAY);ColorLabel cLabel4=new ColorLabel("北", Color.cyan);ColorLabel cLabel5=new ColorLabel("中", Color.red);panel.add(cLabel1,borderLayout.EAST);panel.add(cLabel2,borderLayout.SOUTH);panel.add(cLabel3,borderLayout.WEST);panel.add(cLabel4,borderLayout.NORTH);panel.add(cLabel5,borderLayout.CENTER);}public static class ColorLabel extends JLabel {public ColorLabel(String text,Color color) {this.setText(text);this.setOpaque(true);this.setBackground(color);this.setPreferredSize(new Dimension(60,30));this.setHorizontalAlignment(SwingConstants.CENTER);}}
}显示效果如下
 
手工布局
1、不使用布局器 panel.setLayout(null);
2、添加某个子控件 panel.add(a1)
3、指定子控件的位置大小,a1.setBounds(x,y,w,h)(x、y表示坐标,w、h表示宽度和高度)
public class MyFrame extends JFrame{public MyFrame(String title) {super(title);//创建一个面板JPanel panel=new JPanel();//将面板添加到窗口中this.setContentPane(panel);//设置布局器		panel.setLayout(null);ColorLabel cLabel1=new ColorLabel("我要呆在中间", Color.YELLOW);cLabel1.setBounds(100,40,150,180);panel.add(cLabel1);}public static class ColorLabel extends JLabel {public ColorLabel(String text,Color color) {this.setText(text);this.setOpaque(true);this.setBackground(color);this.setPreferredSize(new Dimension(60,30));this.setHorizontalAlignment(SwingConstants.CENTER);}}
}显示效果如下
 
 缺点:当窗口放大或缩小时,自定义布局不能自适应大小

















