面向对象分析和设计笔记——第6章界面组件
Java应用程序界面设计主要涉及AWT(Abstract Window Toolkit)、Swing两大类库,Swing可看作是AWT的拓展和加强
java.awt--AWT components:使用本地窗口组件,调用操作系统内部的API,支持哥哥操作系统平台所提供的窗口组建的集合;
javax.swing--Swing components:创建了一个新的框架使用模拟窗口组件来代替本地窗口组件,丰富了窗口组建,在不同的平台上表现一致,有能力提供本地窗口系统不支持的其他特性;
1.Component类使所有界面组件的祖先,用来表示一个图形组件
Container容器是一个特殊的组件,又可分为顶级容器和中级容器,内部管理很多原子组件
原子组件:
1)用户通过鼠标输入的:JButton、JCheckBox、JComboBox、JRadioButton、JList、JSlider、JTree
2)不可编辑信息的显示/为组件设置对用户有帮助的提示信息:JLable、JProgressBar、JProgressMoniter
3)用户通过键盘输入的可被编辑的格式化信息的:JColorChooser、JFileChoose、JFileChooser、JTable、JTextArea、JTextField
中级容器:
可以管理自身和原子组件,以便在布局管理器的设置下实现容器嵌套和组件摆放:JPanel、JScrollPane、JSplitPane、JTabbedPane、JToolBar、JLayeredPane、JDesktopPane、JInternalFrame、JRootPane
顶级容器:
将所有的终极容器和原子组件摆放在顶级容器上才可见(才能可视化),可以管理终极容器和原子组件:JFrame、JDialog、JWindow
2.界面搭建方法
1)创建JFrame顶级容器:是java的主框架,所有的Java应用程序界面都是在主框架之中设计的
1 public class FrameTest { 2 public static void main(String[] args) { 3 JFrame theFrame = new JFrame("Hello~");//新建一个空的窗体容器及标题 4 theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭按钮 5 theFrame.setSize(800, 600);//设置窗体大小 6 theFrame.setVisible(true);//设置容器内组件可见 7 } 8 }
[1]继承JFrame创建用户界面程序public class JFrameName extends JFrame{声明私有变量(中级容器或原子组件),调用本类的构造函数中摆放需要布局的元素——创建/初始化私有组件等}
[2]继承JPanel中级容器,把要显示的界面元素添加到该中级容器中,然后把该中级容器放在JFrame内(才可以可视化/显示出这些元素)public class JPanelName extends JPanel{声明私有变量,调用构造函数布局} + main函数中需多new一个JFrame并add(JPanelName)才可以正常显示以作测试
2)在顶级容器上添加中级容器和原子组件,LayoutManager控制布局类型:
使用JFrame窗体的内容嵌板Container提供的add()方法将原子组件/中级容器逐一添加到窗体上进行显示
JFrame frame = new JFrame("Frame name"); Container contentPane = frame.getContentPane(); contentPane.add(new JLable("Label Name"));
直接使用JFrame窗体提供的add()方法将原子组件/中级容器添加到窗体上进行显示
JLable lable = new JLable("Enter something: "); lable.setFont(new Font("Serif", Font.BOLD, 30)); theFrame.add(lable);
利用中级容器JPanel:JPanel是一个没有明显边界的中级容器,不能像JFrame一样单独使用(直接可视化),ta必须放置在另一个容器中,被用作将多个其他图形化Component组织在一起的容器
JLabel stuff = new JLabel("I am a label"); JPanel panel = new JPanel(); panel.add(stuff); frame.add(panel);
多个元素构成的复杂界面通过布局管理使之有序的显示在特定位置
[1]自动化管理void setLayout(LayoutManager mgr),通过java封装好的布局管理器LayoutManager接口,使用了策略设计模式:
BorderLayout:JFrame默认的布局管理器,东西南北中5个区域
JFrame theFrame = new JFrame("BorderLayout"); theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BorderLayout layout = new BorederLayout(); theFrame.setLayout(layout); theFrame.add(new JButton("WEST"), BorderLayout.WEST); //NORTH、EAST、CENTER、SOUTH,通过add()函数的第二个参数设置布局 theFrame.setSize(400, 400); theFrame.setVisible(true);
FlowLayout:JPanel、JApplet默认的布局管理器,有多个不同的构造函数,从上到下、按照对齐方式从左到右进行组件的放置
JPanel thePanel = new JPanel();//无参构造函数默认为居中对齐 theFrame.add(thePanel); for(int I=0;i<20;i++) { thePanel.add(new JButton("Button"+i)); } theFrame.setSize(200, 400); theFrame.setVisible(true);
GridLayout:可以建立一个组件表格,按照由左至右、由上至下在每个grid中放置组件
GridLayout grid = new GridLayout(7, 3); theFrame.setLayout(grid); for (int I=1; I<8; i++) { for(int j=1; j<4; j++) { theFrame.add(new JButton("Row"+i+","+"Column"+j)); } } theFrame.pack();//依据放置的组件设定窗口的大小,使之正好能容纳你放置的所有组件 theFrame.setVisible(true);
注:在复杂的图形用户界面设计中,为了使布局更加易于管理,具有简洁的整体风格,一个包含了多个组建的容器本身也可以作为一个组件加到另一个容器中去,容器中再添加容器,形成容器的嵌套。一般底层为JFrame,利用JPanel的布局管理和嵌套实现分层
[2]手动管理,通过setLocation(), setSize(), setBounds()等组件提供的方法(与平台相关,不鼓励使用)
3)为交互组件添加事件监听器(GUI事件的产生与处理) 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)
GUI事件又称ActionEvent(用户对界面的操作在java语言上的描述),当用户交互时ActionEvent将自动产生
java.awt.event和java.swing.event包中描述了所有可能发生的事件处理
[1]ActionEvent动作事件:按下按钮、TextFiled中按下Enter键
[2]AdjustmentEvent调节事件:在滚动条上移动滑块以调节数值
[3]ComponentEvent组件事件:组件移动、缩放、显示、隐藏等
ContainerEvent容器事件:组件增加、移动等
FocusEvent焦点事件:焦点的获得和丢失
KeyEvent键盘事件:键的按下、释放
MouseEvent鼠标事件:鼠标单击、移动
WindowEvent窗口事件:关闭窗口、图标化
[4]ItemEvent项目事件:选择项目
[5]TextEvent文本事件:文本对象改变
而编程人员需要对这些自动产生的ActionEvent进行响应和处理:
[1]创建Listener(监听器)类:对于某种类型的事件XXXEvent,必须定义且implements实现监听器接口XXXListener监听器类来接收何处理这类事件
1 public class ButtonHandler implements ActionListener {//实现事件监听接口的类 2 public void actionPerformed(ActionEvent event) {//必须实现这个ActionListener中的抽象方法,完成这个方法体 3 JOptionPane.showMessageDialog(ClassName.this, "你按下的是" + event.getActionCommand()); 4 } 5 JButton button = new JBotton("click here!"); 6 button.addActionListener(newButtonHandler());//为button组件注册事件监听器
[2]调用组件的addXXXListener()方法,为XXXEvent注册Listener对象,就可以监听该事件触发的XXXEvent,而后通过监听器中的操作进行相应的处理
[3]对于有些包含了大量函数的监听器接口(WindowListener、MouseListener、FocusListener等),如果要实现内部所有的抽象函数是很麻烦的,java中为它们定义了相应的Adapter适配器类来解决这种情况。适配器类已经实现了某一监听器接口的所有方法,所以可以直接继承extends适配器,并覆写想要实现的方法即可。
1 JFrame frame = new JFrame("adaptor test"); 2 class WindowListenerOne extends WindowAdapter { 3 public void windowClosing(WindowEvent e) { 4 System.exit(0); 5 } 6 } 7 WindowListenerOne w = new WindowListenerOne(); 8 9 frame.addWindowListener(w); 10 frame.setSize(600, 200); 11 frame.setVisible(true);
4)运行程序展示界面
setVisible(true);