Java Swing复杂控件

  • 格式:doc
  • 大小:653.00 KB
  • 文档页数:34

9.1 JTextArea (文本区)JTextArea是一个显示纯文本的多行区域,它具有换行功能,同时能也可以借助JScrollPane 提供垂直和水平滚动的功能。

9.1.1 JT extArea的构造函数9.1.2 JT extArea的常用方法9.1.3文本区与文本域下面示例展示了文本区与文本域的文本显示特点,文本域只能输入和显示单行文本,且不能提供换行与滚动条功能,而文本区则既可以提供通过换行的多行显示,也能通过将文本区添加到一个JScrollPane(滚动窗格)中实现垂直和水平的滚动功能。

示例1运行结果:9.1.4 文本区上的DocumentEvent事件JTextArea经常触发的事件是DocumentEvent事件,DocumentEvent类放在javax.swing.envent包中。

当文本区中的文本进行编辑操作,使文本区中的文本内容发生变化时,就会导致文本区中的文档模型中的数据发生变化,从而导致文本区触发DocumentEvent事件。

DocumentEvent事件实现的接口以及接口中的抽象事件处理方区,当用户朝一个文本区中输入文本时,就触发DocumentEvent事件中的文档内容改变事件,从而把修改的内容添加到另一个文本区中。

运行结果:9.2 JCheckBox(复选框)JCheckBox复选框是一个拥有被选定状态和取消选定状态的对象,用户可以通过点击复选框对象来切换其状态9.2.1 JCheckBox的构造函数9.2.2 JCheckBox的常用方法9.2.3 JCheckBox的ItemEvent事件以及ActionEvent事件当JCheckBox(复选框)的选中状态由于用户的鼠标点击而出现改变时,复选框就会触发ItemEvent事件。

其中ItemEvent 对应的监听器接口和抽象方法如下:JCheckBox注册ItemEvent事件监听器对象的方法如下:以下是一个通过多个复选框选择购买电脑附件的示例,每当用户选中或者是取消复选框状态时就触发ItemEvent事件,在该事件中将被选中的复选框中的内容获取后显示在下面的文本框中。

运行结果:9.3 JRadioButton (单选按钮)JRadioButton(单选按钮)与JCheckBox(复选框)类似,都拥有被选中和未被选中两种状态,用户通过鼠标点击在这两个状态中进行切换。

所不同的是复选框组中每个对象状态的改变都不影响其它复选框对象的状态,而在同一组中的单选按钮则同一时间只有一个单选按钮对象能处于被选中状态。

因此单选按钮在使用时必须拥有一个“按钮组”的控件来将若干个单选按钮归入同一个组中,例如:9.3.1 JRadioButton的构造函数9.2.2 JRadioButton的常用方法9.3.3 JRadioButton的ItemEvent和ActionEvent事件JRadioButton与JCheckBox相同,当用户改变它们的状态时,触发的也同样是ItemEvent事件,不过也可以使用ActionEvent事件来完成用户对于单选按钮的操作事件处理。

示例4运行结果:9.4 JComboBox (组合框)JComboBox (组合框)也叫作下拉列表,叫它组合框是因为它更像是由文本框和列表框组合形成的一个控件,用户可以通过文本框旁的一个箭头按钮将选项列表打开,选中内容后关闭选项列表,并将信息显示在文本框中。

9.4.1 JComboBox的构造函数9.4.2 JComboBox的常用方法9.4.3 JCheckBox的ItemEvent和ActionListener事件当用户使用鼠标点击组合框时,组合框会触发ActionListener事件,而当用户从一个选中一个选项,同时取消前一个被选中选项时则会触发ItemEvent事件。

9.5 JList(列表框)多组数据项可以在列表框中进行同时显示,并且允许用户选择一个或多个项。

9.5.1 JList的构造函数使用JList(Object[] listData)创建的列表框,列表框中的项是静态的,不可修改的。

因为JList控件只提供数据项的显示和提取操作,而不提供数据的添加和修改。

如果需要动态的设置数据项给列表框,就必须使用模型。

这很类似与MVC结构,即JList提供数据的显示和用户的交互,而ListModel(模型)则负责数据的存储和修改。

具体如下:经常用于JList中进行存储数据的模型为DefaultListModel,它用于存储可变数据,具体用法如下:DefaultListModel lstModel = new DefaultListModel(); JList listType = new JList(lstModel);9.5.2 JList的常用方法9.5.3 ListModel的常用方法9.5.4 JList的ListSelectionEvent事件当用户选择列表中的选项使列表选择值发生更改时,就会触发ListSelectioEvnet事件。

ListSelectioEvnet属于javax.swing.event包中,其监听器接口和抽象事件方法如下:JList注册ListSelectioEvnet事件监听器对象的方法如下:以下示例展示的是一个购买电脑的过程案例,窗体中首先使用组合框实现品牌的选择,之后根据品牌在列表框中实现该品牌各种型号的设置。

最后用户选择型号后,该电脑品牌和型号都将显示在窗体下部的文本框中。

运行结果:9.6 容器容器分为底层容器和中间容器。

底层容器有JFrame,JDialog,它们拥有标题栏、菜单栏,是所有控件以及中间容器赖以放置的基本容器。

而中间容器是必须被添加到底层容器才能发挥作用的容器。

它们没有标题栏、没有菜单栏,虽然也能作为容器添加组件,但却不能独立存在。

9.6.1 JPanel面板面板是一个用于放置一个或多个组件的中间容器,拥有默认的布局(FlowLayout流式布局)。

JPanel p = new JPanel();p.add(componet1);p.add(componet2);9.6.2 JScrollPanl 滚动窗格滚动窗格只可以添加一个组件,且该组件拥有多行或者多列的数据显示要求。

大多数情况下这样的组件有JTextArea、JList、JTree、JTable等等。

JscrollPane scroll = new JScrollPane(new JTextArea());9.6.3 JSplitPane拆分窗格拆分窗格顾名思义就是把窗体拆分为两个部分,每个部分可以是一个容器。

拆分窗格有两种两种类型:水平拆分和垂直拆分。

1. 水平拆分splitPane = new JSplitPane(JSplitPane. HORIZONTAL_SPLIT,true);splitPane.setDividerLocation(0.5);splitPane.add(p1,JSplitPane.LEFT);splitPane.add(p2,JSplitPane.RIGHT);2. 垂直拆分splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); splitPane.setDividerLocation(0.5);splitPane.add(p1,JSplitPane.TOP);splitPane.add(p2,JSplitPane.BOTTOM);示例6运行结果:9.7 JT able(表格)JTable(表格)是以行和列的形式显示数据,并允许对表格中的数据进行编辑。

表格必须与模型一起实现MVC结构,即表格提供内容显示和用户交互功能,而模型实现对数据的动态添加和维护功能。

因此,如果创建了不带有模型的表格,其仅仅只能提供内容的显示和获取,而不能提供数据的动态设置。

9.7.1创建不带模型的表格1)调用无参构造函数JTable table = new JTable();2) 以表头和表数据创建表格Object[][] data = {{第1行表数据},{第2行表数据},… ,{ 第N行表数据}}; String[] columnNames ={"列名1 ","列名2",… , "列名N"};JTable table = new JTable(data, columnNames);以下示例展示了利用表数据和表头创建不带模型的表格的方法,示例如下运行结果:9.7.2 创建带模型的表格利用默认的DefaultTableModel作为表格模型,以提供表格中的数据添加、删除操作。

Object data[] = {"内容1", "内容2 ",… , "内容3"}String columnNames[]{"列名1 ","列名2",… , "列名N"};DefaultTableModel model=new DefaultTableModel(null,columnNames); JTable table = new JTable(model);model.addRow(data);示例8运行结果:9.7.3 创建带自定义模型的表格DefaultTableMode有时也不能完全满足用户的要求,例如有时我们需要定义某行或某列是否可以进行编辑、有时我们需要设定某行数据的显示方法。

为了解决以上问题,我们需要定义DefaultTableModel的子类重新实现DefaultTableModel中的一些方法。

例如:其中重定义isCellEditable(int row, int col)并返回false是通知模型,不管表格中的任意一单元格都不允许被编辑。

而getColumnName(int c)和getColumnClass(int c)则是通知模型数据的名称和显示类型。

利用自定义模型实现以下的表格。

表格的常用事件是表选项选择事件ListSelectionEvent,这与JList的列表框中的事件是一致的。

区别仅在于该事件类型的触发事件源不是表格而是表模型,具体的监听器接口及事件抽象方法请看9.5.4。

如果要获得用户选中的表格中的内容,可以使用以下方法,注意这些方法的所属者,有些属于表格,有些属于模型。

示例9运行结果:9.7.4 JTable(表格)的常用方法1. 对表格列的控制1) 设置列不可随容器组件大小变化自动调整宽度.table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);其参数还包括:AUTO_RESIZE_ALL_COLUMNS 在所有的调整大小操作中,按比例调整所有的列AUTO_RESIZE_LAST_COLUMN 在所有的调整大小操作中,只对最后一列进行调整AUTO_RESIZE_NEXT_COLUMN 在UI 中调整了一个列时,对其下一列进行相反方向的调整AUTO_RESIZE_OFF 不自动调整列的宽度;使用滚动条AUTO_RESIZE_SUBSEQUENT_COLUMNS在UI 调整中,更改后续列以保持总宽度不变;此为默认行为2) 限制某列的宽度.TableColumn firsetColumn = table.getColumnModel().getColumn(0);firsetColumn.setPreferredWidth(30);firsetColumn.setMaxWidth(30);firsetColumn.setMinWidth(30);3) 设置当前列数.DefaultTableModel tableModel = (DefaultTableModel) table.getMode l();int count=5;tableModel.setColumnCount(count);4) 取得表格列数int cols = table.getColumnCount();5) 添加列DefaultTableModel tableModel = (DefaultTableModel) table.getMod el();tableModel.addColumn("新列名");6) 删除列table.removeColumn(table.getColumnModel().getColumn(columnInde x));// columnIndex是要删除的列序号2.对表格行的控制1) 设置行高table.setRowHeight(20);2) 设置当前航数DefaultTableModel tableModel = (DefaultTableModel) table.getMo del();int n=5;tableModel.setRowCount(n);3) 取得表格行数int rows = table.getRowCount();4) 添加表格行DefaultTableModel tableModel = (DefaultTableModel) table.getMo del();tableModel.addRow(new Object[]{"sitinspring", "35", "Boss"});5) 删除表格行DefaultTableModel tableModel = (DefaultTableModel) table.getMo del();model.removeRow(rowIndex);// rowIndex是要删除的行序号3.存取表格单元格的数据1) 取单元格数据DefaultTableModel tableModel = (DefaultTableModel) table.getModel ();String cellValue=(String) tableModel.getValueAt(row, column);// 取单元格数据,row是行号,column是列号9.8 JTree(树)9.8.1 树的构造原理及其构造函数构造树形控件的原理很简单,其根节点及其子节点及其叶子都是以DefaultMutableTreeNode为类型的对象定义出来的。