JFrame窗体
窗体是一个组件容器,所有组件都必须有窗体去承载它们,所有jframe窗体类包含一个容器类,所有放置在窗体上的组件实际上都是放置在这容器类中,通过getContentPane()方法可以获取它
JFrame jf=new JFrame();
Container c=jf.getContentPane();
通过add方法把组件添加到容器中
JButton jb=new JButton();
c.add(jb);//添加按钮组件
JFrame用两个常用的构造器:
public JFrame();//1
public JFrame(String name);//2
第二种是带有标题的窗体,也可通过settitle方法来设置标题,其次jframe是默认为不可以,所有在初始化窗体时,要使用setVisible(true)方法设置为可见状态
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);该方法是最常见的关闭窗体的方法。
常用的布局管理器
1.绝对布局管理器
JFrame jf=new JFrame();
Container c=jf.getContentPane();
JButton jb=new JButton("按钮");
c.setLayout(null);//设置无布局管理器
jb.setBounds(10, 30, 40, 50);//设置组件位置,大小
绝对布局管理器,硬性规定了每个组件的位置大小,在不同的系统可能会出现组件重叠的现象。
2.流布局管理器
流布局管理器让组件按指定方向排列,直到这一行放满了组件,才移动到下一行放
for(int i=1;i<10;i++){
c.add(new JButton(String.valueOf(i)));
}
c.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));//设置为流布局管理器,组件居中对齐
在FlowLayout构造器中,alignment参数是组件的对齐方式,FlowLayout.LEFT(左对齐),FlowLayout.CENTER(居中对齐),FlowLayout.RIGHT(右对齐)。
3.边界布局管理器
Jframe窗体的组件容器使用BorderLayout作为默认布局方式,BorderLayout将组件放置在顶部,底部,左边,右边和中间(BorderLayout.NORTH/SOUTH/EAST/WEST/CENTER)
4.网格布局管理器
GridLayout将容器划分为网格,所有组件可以按行和列进行排列,参数rows为行,columns为列,horizGap为网格之间的水平间距,vertGap为网格之间的垂直间距。
常用面板
JPanel,JScrollPane面板
面板也是一个容器,可以容纳其他组件,但必须添加到其他容器中才能发挥作用,JScrollPane是带有滚动条的面板,常用于布置单个组件,并且可以不使用布局管理器,如需要在JScrollPane中放置多个组件,需要将多个组件放置在JPanel面板上,再讲JPanel作为一个组件放置在JScrollPane上。
标签与图标
标签有JLabel类定义,标签不能产生任何类型的事件,只是简单的显示文本和图片
JLabel(String text,Icon icon,int aligment)//创建带文本,图标的JLabel对象,并且设置标签内容的水平对齐方式
ImageIcon(Image image)直接从图片源创建图片
在Swing中放置图标时,把图标放在工程目录下,再直接引用即可
JLabel jl=new JLabel("带有图标的标签",JLabel.CENTER);
Icon icon=new ImageIcon("3.jpg");
jl.setIcon(icon);
按钮
JButton button=new JButton (Icon icon);//带有图标的按钮
JButton button=new JButton (String text);//带文本的按钮
JButton button=new JButton (String text,Icon icon);//带有文本和图标的按钮
单选按钮(JRadioButton)
JRadioButton button=new JRadioButton(Icon icon);//带有图标的按钮
JRadioButton button=new JRadioButton(String text);//带文本的按钮
JRadioButton button=new JRadioButton(String text,Icon icon);//带有文本和图标的按钮
JRadioButton button=new JRadioButton(String text,boolean selected)//带有文本以及选中状态的按钮
单选按钮的使用需要使用ButtonGroup类(按钮组)将单选按钮分组,通过add方法添加到按钮组中,多个单选按钮添加到按钮组后,同一个时间只能有一个单选按钮能被选中,如果没有指定,可以同时选中多个单选按钮
复选框按钮(JCheckBox)
JCheckBox jc=new JCheckBox("足球");
JCheckBox jc2=new JCheckBox("篮球");
JCheckBox jc3=new JCheckBox("跑步");
复选框按钮可以添加到ButtonGroup类(按钮组)中,使用add方法,被添加到同一个按钮组的复选框和单选按钮,同一个时间只能有一个组件处于选中选中状态
文本框(JTextField)
JTextField j=new JTextField();
JTextField j=new JTextField(columns);//构造一个具有指定列数的文本框
JTextField j=new JTextField(text);//构造一个指定字符串内容的文本框
JTextField j=new JTextField(text, columns)//构造一个具有指定列数并包含文本内容的文本框
密码框(JPaasswordField)
密码框的构造方法与文本框相同,密码框是将用户输入的字符串以某种字符显示,如*,同时还可以通过setEchoChar方法,改变密码框的回显字符
文本域(JTextArea)
在JTextArea类中存在一个setLineWrap方法,该方法用于设置文本域是否可以自动换行,设置为true,文本会自动换行,也可以使用JScrollPane面板管理文本,当文本超过组件长度时,会出现滚动条
JScrollPane sp=new JScrollPane();//滚动面板
JTextArea jt=new JTextArea("哈哈是骄傲是的卡上打开哈啥数据库汇顶科"
+ "啥的卡号时间的话斯卡哈的卡号可适当看哈很深刻好看好"
+ "大好时机多看哈随机获得卡号"
+ "技爱仕达卡技术科技的哈卡时间段哈萨克和卡金黄色的看好看的哈烧开后打瞌睡回单卡好");
jt.setLineWrap(true);//设置可以换行
sp.setViewportView(jt);//设置滚动面板管理文本
下拉列表框(JComboBox)
JComboBox jc=new JComboBox();//创建具有默认数据模型的空的JComboBox
JComboBox jc=new JComboBox<>(aModel);//创建一个JComboBox,其列表项目取自指定的ComboBoxModel
JComboBox jc=new JComboBox<>(items);//创建包含指定数组中元素的JComboBox
JComboBox jc=new JComboBox<>(items);//创建包含指定Vector向量对象中元素的JComboBox
一般将下拉列表框中的项目封装为ComboBoxModel类型,ComboBoxModel为接口,可以自定义一个类实现该接口,然后在初始化ComboBoxModel对象时向上转型为ComboBoxModel接口类型,但是必须实现下面两个方法
public void setSelectedItem(Object anItem)//设置下拉列表框中的选项
public Object getSelectedItem()//返回下拉列表中选择的项
还可以继承AbstractListModel类,该类中也有两种方法
getSize()//返回列表长度
getElement()//返回指定索引处的值
列表框(JList)
列表框的构造方法和使用方法与下拉列表框大同小异
进度条(JProgressBar)
JProgressBar jp=new JProgressBar();//创建一个进度条
JProgressBar jp=new JProgressBar(orient);//创建一个具有指定方向的进度条
JProgressBar jp=new JProgressBar(min, max);//创建一个具有指定最小值和最大值的进度条
JProgressBar jp=new JProgressBar(orient, min, max);//创建一个指定方向,最小值和最大值的进度条
setIndeterminate方法设置进度条的样式,true表示不确定任务的执行进度,false则表示确定任务的执行进度
setStringPainted方法设置是否显示提示信息,true显示,false不显示,默认为显示当前任务完成的百分比,可通过setString方法设置指定的提示信息
采用指示确定进度的进度条,不能自动获取任务的执行进度,则必须通过setValue方法反复修改当前的执行进度。
swing事件派发进程
事件派发进程又叫EDT,因为swing是单线程的,所以swing专门提供了一个线程用于组件安全访问,这个线程就是事件派发线程,
EDT实际上是一个队列,先进先出,只有当先前的事件执行完成了,才会去执行后面一个,所以在EDT中不适合进行耗时的事件,会导致进程堵塞,应该把耗时的事件放在独立的一个线程中,然后再通过invokeLater方法使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。
Swing程序只有一个用EDT,该线程负责GUI组件的绘制和更新,通过调用程序的事件处理器来响应用户交互。所有事件处理都是在EDT上进行的,程序同UI组件和其基本数据模型的交互只允许在EDT上进行,所有运行在EDT上的任务应该尽快完成,以便UI能及时响应用户输入。