Swing用户界面组件(1).ppt
《Swing用户界面组件(1).ppt》由会员分享,可在线阅读,更多相关《Swing用户界面组件(1).ppt(74页珍藏版)》请在三一办公上搜索。
1、Swing用户界面组件,Java,模型-视图-控制器设计模式,每个组件有三个要素内容,如按钮的状态(是否按下),或者文本域的文本;外观,颜色,大小等;行为,对事件的反应;三要素之间的关系复杂,Java,模型-视图-控制器设计模式,Swing设计者采用了一种著名的设计模式:模型-视图-控制器(model-view-controller)模式来实现组件的设计。实现一个组件有三个独立的类:模型(model):存储内容;视图(view):显示内容;控制器(controller):处理用户输入;,Java,模型-视图-控制器设计模式,模型只存储内容,必须实现改变内容和查找内容的方法。如,一个文本模型中的
2、方法有:在当前文本中添加或者删除字符以及把当前文本作为一个字符串返回等;模型完全不可见,视图显示存储在模型中的数据;控制器负责处理用户输入事件,如点击鼠标和敲击键盘。然后决定是否把这些事件转化为对模型或视图的改变;,Java,模型-视图-控制器设计模式,Java,模型、视图、控制器对象之间的交互,模型-视图-控制器设计模式,Swing按钮的模型-视图-控制器分析对于大多数组件,模型类实现了名字结尾为Model的接口,如:按钮就实现了ButtonModel接口;可以通过查看ButtonModel接口中的方法来获知按钮模型维护的是哪种类型的数据;,Java,模型-视图-控制器设计模式,Swing库
3、中包含了一个名为DefaultButtonModel的类,该类实现了ButtonModel接口,是JButton的模型类;该类同时也可作为单选按钮、复选框等的模型类;视图和感观相关联,不同感观对应的视图有所不同;当使用Metal观感时,JButton类用BasicButtonUI类作为其视图,用ButtonUIListener类作为控制器;JButton是一个继承了JComponent的包装器类,包含了一个DefaultButtonModel对象,一些视图数据以及一个负责按钮视图的BasicButtonUI对象(Metal感观);JButton button=new JButton(“Blue
4、”);ButtonModel model=button.getModel();ButtonUI ui=button.getUI();,Java,布局管理器,容器内的所有组件的排放由一个布局管理器(layout manager)进行管理。java.awt.Containercontainer.setLayout(LayoutObject);,Java,布局管理器,常用布局管理器流布局管理器(FlowLayout)边界布局管理器(BorderLayout)网格布局管理器(GridLayout),Java,布局管理器,流布局管理器(Flow Layout)其特点是在一行上水平排列组件,直到没有足够的
5、空间为止,再开始新的一行;面板(JPanel)的默认布局管理器;当用户缩放容器时,布局管理器自动地调整组件的位置使其填充可用的空间;但容器中组件的大小不会变;默认情况下,组件是在一行上居中显示。程序员可以设置容器中的组件按左对齐或者右对齐的方式排列;panel.setLayout(new FlowLayout(FlowLayout.LEFT);,Java,布局管理器,流布局管理器(Flow Layout)java.awt.Layout;FlowLayout();FlowLayout(int align);FlowLayout(int align,int hgap,int vgap);常用的行对
6、齐方式 FlowLayout.CENTER;FlowLayout.LEFT;FlowLayout.RIGHT;,Java,布局管理器,边界布局管理器(BorderLayout)将整个容器分为中部、北部、南部、东部或者西部五个区域;程序员可以选择将组件放在哪个区域;默认放在中部;JFrame的内容窗格的默认布局管理器;frame.add(button,BorderLayout.SOUTH);,Java,布局管理器,边界布局管理器(BorderLayout)边界布局管理器在安放组件时,会先放入边缘组件,剩余的可用空间由中间组件占用,如果有某个边缘组件空缺,其它组件会填充该边缘位置;容器缩放时,边界
7、布局会扩大所有组件的尺寸以便填充可用空间,但边缘组件的厚度不会改变,长度会有所改变,而中间组件的大小会发生变化;,Java,布局管理器,java.awt.BorderLayout类BorderLayout();BorderLayout(int hgap,int vgap);,Java,布局管理器,将一个组件放在边界布局管理器的某个部分时,其会填充整个部分的空间,如果此时再放入另一个组入到相同的部分,则后放入的组件会覆盖前一个组件;public class BorderLayoutTest public static void main(String args)JFrame f=new JFra
8、me(BorderLayout Test);f.add(new JButton(South),BorderLayout.SOUTH);f.add(new JButton(South1),BorderLayout.SOUTH);f.setSize(200,200);f.setVisible(true);,Java,布局管理器,可利用中间容器(JPanel)把多个组件放在边界布局管理器的同一个部分;public class BorderLayoutTest public static void main(String args)JFrame f=new JFrame(BorderLayout Te
9、st);JPanel p=new JPanel();f.add(p,BorderLayout.SOUTH);p.add(new JButton(South);p.add(new JButton(South1);f.setSize(200,200);f.setVisible(true);,Java,布局管理器,网格布局管理器(GridLayout)将容器按行列平均划分;容器上的组件添加从第一行的第一列开始,然后是第一行的第二列,以此类推;,Java,布局管理器,Java.awt.GridLayoutGridLayout();GridLayout(int rows,int cols);GridLa
10、yout(int rows,int cols,int hgap,int vgap);,Java,举例:计算器程序,制作一个如图所示的计算器程序。使用面板嵌套技术:,布局管理器,import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Calculator public static void main(String args)CalculatorFrame frame=new CalculatorFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON
11、_CLOSE);frame.setVisible(true);,Java,布局管理器,class CalculatorFrame extends JFrame public CalculatorFrame()setTitle(Calculator);CalculatorPanel panel=new CalculatorPanel();add(panel);pack();,Java,布局管理器,class CalculatorPanel extends JPanel private JButton display;private JPanel panel;private double resu
12、lt;private String lastCommand;private boolean start;,Java,布局管理器,public CalculatorPanel()setLayout(new BorderLayout();result=0;lastCommand=;start=true;/add the display display=new JButton(0);display.setEnabled(false);add(display,BorderLayout.NORTH);ActionListener insert=new InsertAction();ActionListe
13、ner command=new CommandAction();,Java,布局管理器,/add the buttons in a 4 x 4 grid panel=new JPanel();panel.setLayout(new GridLayout(4,4);addButton(7,insert);addButton(8,insert);addButton(9,insert);addButton(/,command);addButton(4,insert);addButton(5,insert);addButton(6,insert);addButton(*,command);,Java,
14、布局管理器,addButton(1,insert);addButton(2,insert);addButton(3,insert);addButton(-,command);addButton(0,insert);addButton(.,insert);addButton(=,command);addButton(+,command);add(panel,BorderLayout.CENTER);private void addButton(String label,ActionListener listener)JButton button=new JButton(label);button
15、.addActionListener(listener);panel.add(button);,Java,布局管理器,private class InsertAction implements ActionListener public void actionPerformed(ActionEvent event)String input=event.getActionCommand();if(start)display.setText();start=false;display.setText(display.getText()+input);,Java,布局管理器,private clas
16、s CommandAction implements ActionListener public void actionPerformed(ActionEvent event)String command=event.getActionCommand();if(start)if(command.equals(-)display.setText(command);start=false;else lastCommand=command;,Java,布局管理器,else calculate(Double.parseDouble(display.getText();lastCommand=comma
17、nd;start=true;public void calculate(double x)if(lastCommand.equals(+)result+=x;else if(lastCommand.equals(-)result-=x;else if(lastCommand.equals(*)result*=x;else if(lastCommand.equals(/)result/=x;else if(lastCommand.equals(=)result=x;display.setText(+result);,Java,文本输入,具有用户输入和编辑文本功能的组件javax.swing.te
18、xt.JTextField文本域组件,一般只能接收单行文本输入javax.swing.text.JTextArea文本区组件,可以接收多行文本输入,Java,JTextComponent,JTextField,JTextArea,文本输入,javax.swing.text.JTextComponentvoid setText(String t);string getText();void setEditable(boolean b);,Java,文本输入,javax.swing.text.JTextFieldJTextField();JTextField(int columns);JTextF
19、ield(String text);JTextFiled(String text,int columns);在JTextField的构造器中设定的列宽度并不是用户能输入的字符个数的上限,用户可以输入一个更长的字符串,但是当文本长度超过文本域长度时输入时就会滚动;,Java,文本输入,将文本域添加到窗口中将文本域添加到面板或其他容器中eg:JPanel panel=new JPanel();JTextField textField=new JTextField(“input”,20);panel.add(textField);,Java,文本输入,标签组件标签是容纳文本的组件,不响应用户输入;可
20、以利用标签标识组件,如文本域;用相应的文本构造JLabel组件;将标签组件放置在离要标识的组件足够近的地方;,Java,文本输入,javax.swing.JLabel;JLabel(String text);JLabel(Icon icon);JLabel(String text,int align);JLabel(String text,Icon icon,int align);align可以用SwingConstants接口中的常量来指定,也可以用JLabel来指定,因为其实现了该接口;例:JLabel label=new JLabel(“hours”,SwingConstants.RIG
21、HT);或者 JLabel label=new JLabel(“hours”,JLabel.RIGHT);上面的代码创建了一个label,并指定label的对齐方式为右对齐。,Java,实例:一个可以设置时间的钟,本程序演示了一个可以设置时间的钟。当用户在文本域中输入相应的小时和分钟数值时,时钟就将长针和短针绘制出来。本程序需要监视文本域的变化。文本类组件(继承JTextComponent的组件)由文本模型(Document接口)来捕捉,获得文本模型的方法是:Document getDocument();/JTextComponent再在文本模型安装文档监听器(document listene
22、r)能够监听文本域变化事件。,实例的关键代码,当文本发生改变后,文档监听器(document listener)能够监听到该事件的发生,并调用DocumentListener接口中的下列方法之一:void insertUpdate(DocumentEvent event)void removeUpdate(DocumentEvent event)void changedUpdate(DocumentEvent event)当添加或者删除字符时,应该调用前两个方法。所以文档监听器(document listener)必须实现这三个方法:void insertUpdate(DocumentEven
23、t event)setClock();void removeUpdate(DocumentEvent event)setClock();void changedUpdate(DocumentEvent event),文本区(JTextArea),文本区JTextArea组件可以让用户输入多行文本。在JTextArea组件中,可以指定文本区的行数和列数:textArea=new JTextArea(8,40);/8行40列,一行的结尾为n(回车)符如果文本区的文本超出显示范围,则其余的文本会被剪裁。可以使用换行来避免行过长:textArea.setLineWrap(true);在Swing中,文
24、本区没有滚动条,需要手动安装:JScrollPane scrollPane=new JScrollPane(textArea),演示TextAreaTest.java,选择组件,常见的选择组件有:复选框、单选按钮、选项列表以及滑块等。1).复选框JCheckBox如果想要接收的输入只有“是”或“非”两者的话,可以使用复选框组件。这种组件缺省带有标识标签。,在构造器中可以指定该标签的文本:bold=new JCheckBox(“Bold”);用户点击复选框的动作监听器为实现ActionListener接口。(actionPerformed方法),复选框实例:监听器使用,实例:使用选中的字型显示字
25、符串。bold=new JCheckBox(“Bold”);italic=new JCheckBox(“Italic”);.class CheckBoxListener implement ActionListener public actionPerformed(ActionEvent event)CheckBoxListener listener=new CheckBoxListerner();bold.addActionListener(listener);italic.addActionListener(listener),演示CheckBoxTest.java,复选框JCheckBo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Swing 用户界面 组件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-2818109.html