1 .简介
Swing是一个用于开发Java应用程序用户界面的开发工具包,是由纯Java实现的。以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格,不依赖操作系统的支持,这是它与AWT组件的最大区别。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
2 .Swing的层次结构
3 .Swing容器
Swing容器分为三个:顶层容器、通用容器和专用容器。
3.1 顶层容器
顶层容器可以独立存在,包括JFrame、JDialog、JApplet、JWindow(JDialog不可以独立存在)。
JFrame是大多数应用程序的基本窗口,有边框、标题和按钮,允许程序员把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。
JDialog对话框。在Swing中,有两个对话框类,它们是JDialog类和JOptionPane类。JDialog类提供构造并管理通用对话框,作为对话框的基类。对话框与一般窗口不同,对话框依赖其他窗口,当它所依赖的窗口消失或最小化时,对话框也将消失;窗口还原时,对话框又会自动恢复。JDialog对象也是一种容器,因此也可以给JDialog对话框指派布局管理器,对话框的默认布局为BoarderLayout布局。但组件不能直接加到对话框中,对话框也包含一个内容面板,应当把组件加到JDialog对象的内容面板中。由于对话框依赖窗口,因此要建立对话框,必须先要创建一个窗口。JDialog的构造方法有很多,这里列举最具代表性的一个,JDialog(JFrame f,String s,boolean b),构造一个标题为s,初始化不可见的对话框。参数f设置对话框所依赖的窗口,参数b决定对话框是否强制或非强制型,强制意味着禁止其他窗口输入。JOptionPane类给一些常见的对话框提供许多便于使用的选项,例如下所示
JApplet是一种特殊的Java程序经过编译后可以被嵌入到HTML中,在浏览器内显示一个小程序界面。
JWindow没有边框标题和按钮,用作应用程序的启动画面。
3.2 中间容器
中间容器不能独立存在,必须放在顶层容器内,且能够容纳其他控件,包括JPanel、JScrollPane、JToolBar、JSplitPane、JTabbedPane。用法都是New出对应的面板,可以向其中添加组件,之后放到JFrame中即可,这里不再做一一截图。
JPanel:最普通的面板,没有特殊功能,主要用来容纳其它控件。
JScrollPane:滚动面板,即带有长宽滚动条,主要用来容纳大型控件。
JToolBar:工具栏面板,包含图标按钮。可以在程序的主窗口之外浮动或是托拽。
JSplitPane:分割式面板。
JTabbedPane:选项卡面板。
3.3 特殊容器
特殊容器其实就是中间容器的一种,只不过它在图形上个更加能够起到美化和专业化的作用。包括JInternalFrame,JLayeredPane,JRootPane等。
JinternalFrame的使用跟JFrame几乎一样,可以最大化、最小化、关闭窗口、加入菜单等功能;唯一不同的是JinternalFrame JInternalFrame不能单独出现,必须依附在最上层组件上。
JLayeredPane:分层窗口,允许组件在需要时互相重叠。
4 .Swing基本组件
继承自JComponent的组件都是swing的基本组件,它们有一些通用的方法,如设置边框、背景颜色等。组件大致分为按钮、文本组件、不可编辑显示组件、菜单、其他组件。
按钮:JButton(常规按钮)、JCheckBox(复选框)、JRadioButton(单选按钮)。
文本组件:JTextField(文本字段)、JPasswoordField(密码框)、JTextArea(纯文本)。
不可编辑显示组件:JLabel(显示不可编辑文本)、JToolTip(显示不可编辑文本)、JProgreesBar(进度条)。
菜单:JMenu(普通菜单)、JPopupMenu(弹出式菜单)。
其他组件:JFileChooser(文件选择器)、JColorChooser(颜色选择器)、JTable(表格)、JTree(树)、JComboBox(下拉框)等等。
JTree的用法有很多,它的构造方法有:JTree()、JTree(Hashtable value)、JTree(Object[] value)、JTree(TreeModel model)、JTree(TreeNode node)、JTree(Vector value)、JTree(TreeNode node,boolean askaAllowsChildren)
JColorChooser应用场景一般是点击按钮触发颜色管理器,以下是它的示例:
JButton btn= new JButton(“选择设置当前面板颜色”);
Btn.addActionListener(newActionListener(){
Public void acionPerformed(ActionEvente){
Color c =JColorChooser.showDialog(frame,”选取颜色”,null);
frame.getContentPane().setBackground(c);
}
});
其他组件的使用示例请见下文。
5 .Swing布局
布局是组件的摆放位置,可以跨平台,常用的布局管理器有FlowLayout、BorderLayout、BoxLayout、CardLayout、GridLayout和GridBagLayout。JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout。
FlowLayout类是最简单的布局管理器,它按照从左到右的顺序安排组件,直至没有多余的空间,然后转到下一行。
BorderLayout对象将界面分成五大区域,分别用BorderLayout类的静态常量指定:PAGE_START(上)、PAGE_END(下)、LINE_START(中左)、LINE_END(中右)、CENTER(中间)。
BoxLayout可以将组件由上至下或由左至右依次加入当前面板。
CardLayout卡片布局和其他布局不同,因为它隐藏了一些组件。卡片布局就是一组容器或者组件,它们一次仅仅显是一个,组中的每个容器称为卡片。
GridLayout表格,当组件加入时,会依序由左至右,由上至下填充到每个格子。
GridBagLayout功能最为强大,可以管理大小不同的行和列,可以任意摆放组件。
可以设置布局为null来进行绝对布局,但它不能实现跨平台。
6 .Swing事件
事件是用户与程序交互的桥梁,JDK中内置了各种事件,针对每种事件又定义了事件接口和回调方法,我们只需在回调方法中处理业务逻辑就可以轻松的处理事件,一般使用匿名内部类方式实现。例如给按钮加事件:
JButton.addActionListener(newActionListener(){
Public void actionPerformed(ActionEvente){
//处理业务逻辑…
}
});
给文本框加获取焦点事件:
JTextField.addFocusListener(newFocusListener(){
Public void focusGained(FocusEvent e){
//处理业务逻辑…
}
});
7 .Swing相关问题
7.1 Swing跟数据库交互?
Swing连接数据库与Java后台连接数据库的方法是完全一样的,例如用JDBC连接数据库只需要获取连接、获取Statement、执行SQL语句、获取结果集、关闭连接几个步骤。
7.2 Swing进行列表展示?
使用JTable,见如下说明。
JTable table = new JTable();
table.setModel(newDefaultTableModel(
//此处处理列表展示数据,要求返回二维数组。结果集返回每一条数据的值放在一个数组中,用二维数组表示结果集
,new String[] {
//此处放列表表头展示项,如:
“ID”,“站点名称”,”站点编号”,…
}
));
//创建滚动面板,设置滚条
JScrollPane scrollPanel = new JScrollPane (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
//将JTable放入滚动面板
scrollPanel.setViewportView(table);
//创建普通面板,并将滚动面板添加进去
JPanel panel = new JPanel();
Panel.add(scrollPanel);
7.3 Swing如何读取Excel?
利用文件选择器获取所选文件路径,再利用org.apache.poi里边的类进行读取。
JFileChooserchooser = newJFileChooser();//创建选择器
chooser.setFileFilter(newFileNameExtensionFilter("Excel表格", "xls"));//过滤扩展名
//弹出文件选择器
int option = chooser.showOpenDialog(null);
if(option == JFileChooser.APPROVE_OPTION){
Filefile = chooser.getSelectedFile();//获取到文件对象
//利用poi读取文件内容
FileInputStreamis = newFileInputStream(file);
HSSFWorkbookworkBook = newHSSFWorkbook(is);
HSSFSheetsheet = workBook.getSheetAt(0);
for(int rowNum = 1; rowNum<= sheet.getLastRowNum(); rowNum++){
HSSFRowrow = sheet.getRow(rowNum);
HSSFCellcontext1 = row.getCell(0);
HSSFCellcontext2 = row.getCell(1);
……
}
}
7.4 Swing如何展示下拉列表?
JComboBox下拉框可以展示下拉列表,它需要一个数组来展示列表中的数据,然后在创建下拉框的时候把Object[]放进去就好啦。
7.5 Swing如何实现增删改查?
增删改查实现差别不大,共同点是点击触发事件触发逻辑处理方法调用数据库。JTable的getSelectedRow()方法可以获取用户选择表格数据的行号,JTable的getValueAt(int row,int columns)方法可以获取到指定行列的值,根据该值执行删除或修改方法。
7.6 Swing如何进行网络数据传输?
采用UDP传输方式,创建DatagramPacket实例,调用DatagramSocket类的send和receive方法发送和接收。