第六章Swing用户界面组件 布局管理介绍 文本输入 选择组件 菜单 对话框
6.1布局管理器 一.组件设置过程 定义组件 例:JButton redButton=new JButton(“red”); 添加到面板中 例:add(redButton); 为组件设置监听器 例:redButton.addActionListener(listener); 组件多时怎么办?
二.布局管理器 Java采用布局管理器对放置在容器内的组件实行动态管理 Java支持四种布局 FlowLayout BorderLayout GridLayout CardLayout
1. Flow Layout 组件按照加入的先后顺序从左向右排列 一行排满之后就转到下一行继续从左向右排列 每一行中的组件都居中排列 FlowLayout是Panel和Applet型容器的默认使用布局
自左向右、居中排列
构造新布局 定义流布局管理方法 FlowLayout(int align)根据指定的对齐方 式来构造一个新FlowLayout 参数:align:LEFT、CENTER、RIGHT FlowLayout(int align,int hgap,vgap)根据指定对齐方式来构造新的FlowLayout hgap:新水平距离 vgap:新垂直距离
设置布局管理 setLayout(LayoutManager m) 例:FlowLayout m=new FlowLayout(); setLayout(m); 或:setLayout(new FlowLayout);
2. Border Layout 它把容器的空间分为: 东、西、南、北、中 在BorderLayout类中用EAST、WEST、SOUTH、NORTH、CENTER常量来表示上述划分,以决定组件的安放位置
BorderLayout.NORTH BorderLayout.WEST BorderLayout.EAST BorderLayout.CENTER BorderLayout.SOURTH
例:下面为将两个按钮放在容器上部和下部的代码: JButton button1,button2; setLayout(new BorderLayout()); button1=new JButton(“北”); button2=new JButton(“南”); add(button1,BorderLayout.NORTH); add(button2,BorderLayout.SOUTH);
符号表示 BorderLayout常量被定义为字符串 例:BorderLayout.SOUTH被定义为字符串:South 上例应用时可写为: add(button1,“North”); add(button2,“South”);
3。GridLayout 把容器划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中 可用方法setLayout来设置网格布局 setLayout(new GridLayout(行数、列数)) setLayout(new GridLayout(3,4));
CardLayout的容器可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就象一叠“扑克牌”每次只能显示最上面的一张
三.面板 1.存在的问题: 2.解决方法: 创建一个面板,先将组件添加到面板上, 再将面板添加到更大的容器里.代码如下: Container containPane=getContentPane(); JPanel panel=new JPanel(); panel.add(Compoment c); containPane.add(panel, “Sourth”);
6.2常用组件 1.文本输入 文本域、文本区、标签… 2.选择组件 复选框、单选按钮… 3.菜单 弹出菜单、下拉菜单… 4.对话框 选择对话框、文件对话框…
6.2.1文本输入--TextTest.java 用于文本输入的组件: 文本域:用于进行单行文本输入输出, 其对应的类为:JTextField 文本区:可以接受多行文本输入,其对应 的类为JTextArea API:void setText(String t) string getText() void setEditable(boolean b)
1.文本域 构造方法 JTextField()--文本域的长度为一个字符 JTextField(int x)--文本域的长度为X个字符 JTextField(String s)--文本域的初始字符 串为S JTextField(String s,int x)--文本域的初始 字符串为S,长度为X个字符
添加文本域 把一个文本域添加到一个窗口的通常办法是把它添加到一个面板或其它容器中 代码: JPanel panel=new JPanel(); JTextField textField=new JTextField(“文本域输入”20); panel.add(textField);
改变文本域的大小 列不是一个精确的测量单位,一列就是一个字符在当前使用的字体下的宽度 可用setColumn(int x)方法改变列的大小 textField.setColumn(10); 调用setColumn()方法后需要调用所在容器的validate方法,重新计算组件大小 panel.validate();
textField.getDocument(). addDocumentListener(listener) 安装文档监听器 textField.getDocument(). addDocumentListener(listener) 文档接口DocumentListener中含有三个方法: void insertUpdate(DocumentEvent e) void removeUpdate(DocumentEvent e) void changeUpdate(DocumentEvent e) 当文本发生改变后,上面三个方法中的一个会被调用. 例:一个文本域的例子TextTest.java
DocumentListener listener = new ClockFieldListener(); //定义文本监听器 DocumentListener listener = new ClockFieldListener(); JPanel panel = new JPanel(); //定义文本域、注册监听器 hourField = new JTextField("12", 3); panel.add(hourField); hourField.getDocument().addDocumentListener(listener); minuteField = new JTextField("00", 3); panel.add(minuteField); minuteField.getDocument().addDocumentListener(listener);
//将文本框中的字符串转换为数字 { try { int hours = Integer.parseInt( hourField.getText().trim()); int minutes = Integer.parseInt( minuteField.getText().trim()); clock.setTime(hours, minutes); }
//监听器类 private class ClockFieldListener implements DocumentListener { public void insertUpdate(DocumentEvent e) { setClock(); } public void removeUpdate(DocumentEvent e) { setClock(); } public void changedUpdate(DocumentEvent e) {} }
2.文本区--TextAreaTest.java 构造方法: JTextArea(int rows,int cols) JTextArea(String text,int rows,int cols) 改变文本区大小: setColumn(int cols) setRows(int rows) 追加文本 append(String newText)
JScrollPane(componemt c) 打开或关闭换行 setLineWrap(boolean word) 滚动窗格 JScrollPane(componemt c) 若使用滚动条,必须把文本区插入到一个滚动窗格中,然后再把滚动窗格插入到内容窗格中.代码如下: textArea=new JTextArea(8,40); JScrollPane scrollPane=new JScrollPanel(textArea); contentPane.add(scrollPane, “ Center”);
textArea.setLineWrap(true); 处理超长文本 textArea.setLineWrap(true); 例:TextAreaTest
//设置控制滚动条的按纽 wrapButton = new JButton("换行"); buttonPanel.add(wrapButton); wrapButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { boolean wrap = !textArea.getLineWrap(); textArea.setLineWrap(wrap); scrollPane.validate(); wrapButton.setText(wrap ? “不换行” : “换行”); } });
contentPane.add(buttonPanel, BorderLayout.SOUTH); textArea = new JTextArea(8, 40); scrollPane = new JScrollPane(textArea); contentPane.add(scrollPane, BorderLayout.CENTER); }
3.标签和标签组 标签是容纳文本的组件 常用来标识别的组件 构造方法: JLabel(String text) JLabel(Icon icon) JLabel(String text,int align) JLabel(String text,Icon,icon,int align)
参数说明: text:标签中的文本 icon:标签中的图标 align: SwingConstant. LEFT SwingConstant.RIGHT SwingConstant.CENTER void setText(String text) void setIcon(Icon icon)
6.2.2选择组件 包括: 复选框 单选按钮 选项列表 滑块
1.复选框--CheckBoxTest.java 构造复选框 JCheckBox bold=new JCheckBox(“bold”); 用setSelected()方法来选定一个复选框以及取消选定 bold.setSelected(true) 提取复选框当前状态 bold.isSelected()
添加监听器 ActionListener listener=…… bold.addActionListener(listener) 监听器的接口方法为: actionPerformed() 例:CheckBoxTest.java
//定义复选 框监听器类 ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { int mode = 0; if (bold.isSelected()) mode += Font.BOLD; if (italic.isSelected()) mode += Font.ITALIC; label.setFont(new Font("Serif", mode, FONTSIZE)); } };
bold = new JCheckBox("Bold"); bold.addActionListener(listener); //定义复选框、注册监听器 bold = new JCheckBox("Bold"); bold.addActionListener(listener); buttonPanel.add(bold); italic = new JCheckBox("Italic"); italic.addActionListener(listener); buttonPanel.add(italic);
2.单选按钮--RadioButtonTest.java A.构造单选按钮 JRadioButton smallButton=new JRadioButton(“small”,false); B.把单选按钮加入面板中 Panel.add(smallButton); C.构造按钮组: ButtonGroup group=new ButtonGroup(); D.把JRadioButton类型对象添加到该按钮组 group.add(smallButton);
API: Javax.swing.JRadioButton JRadioButton(String lable,boolean state) JRadioButton(String lable,Icon icon) Javax.swing.ButtonGroup Void add(AbstractButton b)`` ButtonGroup() 例:RadioButtonTest.java
//构造单选按纽和按纽组 buttonPanel = new JPanel(); group = new ButtonGroup(); addRadioButton("Small", 8 ); addRadioButton("Medium", 12 ); addRadioButton("Large", 18 ); addRadioButton("Extra large", 36 );
public void addRadioButton(String name, final int size ) { boolean selected =( size == DEFAULT_SIZE;) JRadioButton button = new JRadioButton(name, selected); group.add(button); // 将单选按纽加到单选按纽组 buttonPanel.add(button); //为单选按纽注册监听器 ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent evt) { label.setFont(new Font("Serif", Font.PLAIN, size));} }; button.addActionListener(listener); }
除文字外,单选按钮、复选框也可以作菜单项 6.2.3菜单 菜单 菜单栏 除文字外,单选按钮、复选框也可以作菜单项 菜单项 步骤: 框架 菜单栏 菜单 菜单项
一.菜单创建过程 创建菜单栏 JMenuBar menuBar=new JMenuBar(); 框架中添加菜单栏 frame.setJMenuBar(menuBar); 创建菜单 JMenu editmenu=new JMenu(“Edit”); 把菜单加入菜单栏中 menuBar.addMenu(editmenu);
创建菜单项: JMenuItem cutItem=new JMenuItem(“Cut ”); 向菜单中添加菜单项 editmenu.add(cutItem); 添加子菜单 JMenu optionsmenu=new JMenu(“Options”); editmenu.add(optionsmenu)
二.安装菜单项监听器 当用户选择一个菜单时,一个动作事件就会被触发,你需要为每一个菜单项安装一个动作监听器 ActionListener listener=…..; cutItem.addActionListener(listener);
Add(“Paste”)相当于item=new JMenuItem(“Paste”)和editMenu.add(item)的作用 添加监听器 JMenu.add(String s)是一个很方便的方法,它可以把一个菜单项添加到菜单的结尾 editMenu.add(“paste”); add()返回创建的子菜单项,因此可以捕获它的返回值并添加监听器 JMenuItem pItem=editMenu.add(“Paste”); pItem.addActionListener(listener);
常用方法 JMenuBar()创建一个菜单栏 JMenu(String label)创建一个菜单 JMenuItem(String label)创建一个菜单项 void addSeparator()添加一个分隔行 JMenuItem insert(JMenuItem,int index) 把一个菜单项添加到菜单的指定位置 void insertSeparator(int index)把一个分隔符添加到菜单的指定位置 void remove(JMenuItem item) 删除指定菜单项
三.菜单项中的图标 可以通过JMenuItem(String,Icon)或者JMenuItem(Icon)来为菜单指定一个图标,或用JMenuItem类中的setIcon方法来设定图标。 API: Javax.swing.JMenuItem JMenuItem(String s,Icon icon) 例如: JMenuItem cutItem=new JMenuItem( “cut”,new ImageIcon(“cut.gif”)
四.复选框菜单项 创建一个复选框菜单项 JCheckBoxMenuItem readonlyItem=new JCheckBoxMenuItem(“read-only”); 将复选框菜单项添加菜单中 optionsMenu.add(readonlyItem);
五.单选按钮菜单项 同常规按钮一样,先将其添入按钮组 ButtonGroup group=new ButtonGroup(); JRadioButtonMenuItem insertItem=new JRadioButtonMenuItem (“insert”); insertItem.setSelected(true); JRadioButtonMenuItem overtypeItem=new JRadioButtonMenuItem (“overtype”); group.add(insertItem); group.add(OvertypeItem);
optionsMenu.add(insertItem); optionsMenu.add(OvertypeItem); 将单选按钮菜单项添加菜单中 optionsMenu.add(insertItem); optionsMenu.add(OvertypeItem);
是一种并非固定在菜单栏中,而是可随处浮动的菜单 六.弹出菜单 是一种并非固定在菜单栏中,而是可随处浮动的菜单 创建弹出菜单 JPopupMenu popup=new JPopupMenu(); 添加菜单项 JMenuItem item=new JMenuItem(“cut”); item.addActionListener(listener); popup.add(item);
弹出式菜单并不总显示在窗口顶部,必须用show方法显示 show(Component c,int x,int y); 例:popup.show(Panel,x,y); show方法常常放在一个事件监听器方法中,当事件发生时,显示弹出式菜单 这个事件通常为鼠标右键,就是弹出触发器。 使用触发器步骤如下: 1。安装鼠标监听器 2。在鼠标监听器中添加如下代码:
例:MenuTest.java public void mouseReleased(MouseEvent event) { if(event.isPopupTrigger()) popup.show(event.getComponent(), event.getx(),event.gety()); } 常用API: Javax.swing.JPopupMenu Void show(Componemt c,int x,int y) c:弹出菜单在其内显示的位置 Boolean isPopupTrigger() Java.awt.event.MouseEvent 如果该鼠标事件是弹出菜单触发器,则返回 true 例:MenuTest.java
class MenuFrame extends JFrame { public MenuFrame() setTitle("MenuTest"); setSize(WIDTH, HEIGHT); JMenu fileMenu = new JMenu("File"); JMenuItem newItem = fileMenu.add(new TestAction("New"));
JMenuItem openItem = fileMenu.add(new TestAction("Open")); openItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_O, InputEvent.CTRL_MASK)); fileMenu.addSeparator(); saveItem = fileMenu.add(new TestAction("Save")); saveItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_S, InputEvent.CTRL_MASK)); saveAsItem = fileMenu.add(new TestAction("Save As")); fileMenu.add(new AbstractAction("Exit") { public void actionPerformed(ActionEvent event) {System.exit(0); });
readonlyItem = new JCheckBoxMenuItem("Read-only"); ButtonGroup group = new ButtonGroup(); JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert"); insertItem.setSelected(true); JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype"); group.add(insertItem); group.add(overtypeItem);
Action cutAction = new TestAction("Cut"); cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif")); Action copyAction = new TestAction("Copy"); copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif")); Action pasteAction = new TestAction("Paste"); pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif")); JMenu editMenu = new JMenu("Edit"); editMenu.add(cutAction); editMenu.add(copyAction); editMenu.add(pasteAction);
popup = new JPopupMenu(); popup.add(cutAction); popup.add(copyAction); popup.add(pasteAction); getContentPane().addMouseListener(new MouseAdapter() {public void mouseReleased(MouseEvent event) {if (event.isPopupTrigger()) popup.show(event.getComponent(), event.getX(), event.getY()); } });
class TestAction extends AbstractAction { public TestAction(String name) { super(name); } public void actionPerformed(ActionEvent event) System.out.println(getValue(Action.NAME) + " selected."); }
七.快捷键和加速器 API: Javax.swing.JMenuItem JmenuItem(String lable,int mnemonic) void setAccelerator(keyStoke k) javax.swing.AbstractButton void setMnemonic(char mnemonic)
设置菜单项快捷键 JmenuItem cutItem=new JmenItem(“Cut”,’t’); 设置菜单快捷键 JMenu helpMenu =new JMenu(“Help”); helpMenu.setMnemonic(‘H’); 设置加速器 openitem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_O, InputEvent.CTRL_MASK));
6.2.4 对话框 对话框分为: 模式对话框:其特征是在处理完对话框之前不能同应用程序主窗口进行交互。如:文件模式对话框 无模式对话框:允许用户同时在对话框和程序剩余部分中输入信息。如:工具栏 常见对话框:选项对话框、文件对话框、颜色选择器、工具栏、数据交换等
一.选项对话框 Swing中的JOptionPane类提供了一些简单对话框用于收集用户的信息。 JOptionPane类有四个静态方法来显示这些对话框: showMessageDialog showConfirmDialog showOptionDialog showInputDialog
几个常用API: showMessageDialog( Component parent, Object message, String title, int messageType, Icon icon);
showConfirmDialog( Component parent, Object message, String title, int optionType, int messageType, Icon icon);
showOptionDialog( Component parent, Object message, String title, int optionType, int messageType, Icon icon, Object[] option, Object default);
showInputDialog( Component parent, Object message, String title, int messageType, Icon icon, Object[] option, Object default);
例:显示一条信息并让用户确认或取消。代码如下: int selection=JOptionPane. ShowConfirmDialog(parent,“message”, “Title”,JOptionPane.OK_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE); if(selection==JOption.OK_OPTION….. 例:OptionDialogTest.java
Swing提供了一个 JFileChooser类可以用来显示一个文件对话框 showOpenDialog用来显示一个用于打开文件的对话框 二.文件对话框 Swing提供了一个 JFileChooser类可以用来显示一个文件对话框 showOpenDialog用来显示一个用于打开文件的对话框 showSaveDialog用来显示一个用于保存文件的对话框 使用对话框的步骤 1.创建一个JFileChooser对象 JFileChooser chooser=new JFileChooser(); 2.通过调用setCurrentDirectory方法来设置当前目录 chooser.setCurrentDirectory(new File(“.”));
3.使用setSelected提供一个用户使用的默认文件名 chooser.setSelectionFile(new File(filename)); 4.如果允许用户选择多个文件,需调用setMultiselectionEnabled()方法 chooser.setMultiselectionEnabled(true); 5。可使用setFileselectedMode()方法,通过参数设置确定选择对象 参数取值: JFileChooser.FILES_ONLY JFileChooser.DIRECTORIES_ONLY JFileChooser.FILE_AND_DIRECTORIES
6.调用showOpenDialog或showSaveDialog来显示对话框,必须为这两个方法提供父组件 int result=chooser.showOpenDialog(parent) int result=chooser.showSaveDialog(parent) 7.使用getSelectFile()或者getSelectFiles()来得到一个或多个文件。 若只需获得文件对象的名字,可用getPath()方法 String filename= chooser.getselectedFile().getPath() ; 例:FileChooserTest.java
为了实现一个自己的对话框,需要派生一个JDialog类的子类,步骤如下: 三.创建对话框 为了实现一个自己的对话框,需要派生一个JDialog类的子类,步骤如下: 1.在对话框构造器中,调用基类JDialog的构造器 2.添加该对话框的用户界面组件 class AboutDialog extends JDialog { public AboutDialog(JFrame owner) { super(owner, "About DialogTest", true); 3添加事件处理器 JButton ok = new JButton("Ok"); JPanel panel = new JPanel(); panel.add(ok); 4设置对话框的大小 ok.addActionListener(new ActionListener() { public void actionPerformed (ActionEvent evt) { setVisible(false); } contentPane.add(panel, BorderLayout.SOUTH); setSize(250, 150);
若要显示对话框,就要创建一个实例,并调用show() Jdialog dialog=new AboutDialog(this) dialog.show 例:DialogTest.java