第九章 窗口、菜单和对话框 本章的任务: 介绍图形用户界面的高级组件。这些组件包括窗口、菜单和对话框等,它们可以构造出标准GUI应用程序。最后,简要介绍Java Swing的使用方法。
本章主要内容 1.窗口 2.菜单 3.对话框 4.Swing简介
9.1 窗口 Java的窗口由Frame类生成,遗憾的是它不具有关闭功能,必须要在程序中实现窗口事件监听接口并编写关闭窗口的代码才行。 9.1 窗口 Java的窗口由Frame类生成,遗憾的是它不具有关闭功能,必须要在程序中实现窗口事件监听接口并编写关闭窗口的代码才行。 本节介绍创建可关闭窗口的几种方法以及窗口的使用。
9.1.1 创建可关闭窗口 例9.1 方式1:创建一个可关闭的空白窗口,如图所示。
import java.awt.*; import java.awt.event.*; class W1 extends Frame implements WindowListener { W1() { super("Window1"); setSize(350,200); setVisible(true); addWindowListener(this); }
public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public static void main(String args[]) { new W1();
9.1.2 窗口事件适配器 例9.2 方式2:创建一个可关闭的空白窗口。 import java.awt.*; 例9.2 方式2:创建一个可关闭的空白窗口。 import java.awt.*; import java.awt.event.*; public class W2 extends Frame { W2() { super("Window2"); setSize(350,200); setVisible(true); addWindowListener(new Win());
} public static void main(String[] args) { new W2(); class Win extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0);
窗口事件适配器是为方便程序员而专门设计的类。定义 : public abstract class WindowAdapter extends Object implements WindowListener { public WindowAdapter() // 构造方法 public void windowOpened(WindowEvent e) // 窗口被打开后调用 public void windowClosing(WindowEvent e) // 窗口被关闭时调用 public void windowClosed(WindowEvent e) // 窗口被关闭后调用 public void windowIconified(WindowEvent e) // 窗口被缩小为图标时调用 public void windowDeiconified(WindowEvent e) // 窗口被复原时调用 public void windowActivated(WindowEvent e) // 窗口激活时调用 public void windowDeactivated(WindowEvent e) // 窗口失活时调用 }
9.1.3 匿名类 例9.3 方式3:创建一个可关闭的空白窗口。 import java.awt.*; 9.1.3 匿名类 例9.3 方式3:创建一个可关闭的空白窗口。 import java.awt.*; import java.awt.event.*; public class W3 { public static void main(String[] args) { Frame f=new Frame("Window3"); f.setSize(350,200); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
9.1.4 在窗口中加入组件 例9.4 在窗口中添加按钮,点击“显示”按钮可以显示文字,点击“退出”按钮可关闭窗口,同时窗口右上角的关闭按钮也起作用。如图所示。
import java.awt.*; import java.awt.event.*; public class W4 extends Frame implements ActionListener { Button btn1, btn2; TextField f; W4() { super("Window4"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
setSize(350,200); btn1=new Button("显示"); btn2=new Button("退出"); f=new TextField(20); setLayout(new FlowLayout()); add(f); add(btn1); add(btn2); btn1.addActionListener(this); btn2.addActionListener(this); show(); }
public static void main(String args[]) { new W4(); } public void actionPerformed(ActionEvent e) { f.setText("你按下了“" + e.getActionCommand() + "”按钮"); if (e.getSource()==btn2) { for (int i=0; i<100000000; i++); System.exit(0);
9.1.5 多重窗口 例9.5 设计一个多重窗口的程序,如图所示。
import java.awt.*; import java.awt.event.*; public class W5 extends Frame implements ActionListener { Button btn; W5() { super("Window5"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
setSize(350,200); btn=new Button("打开新窗口"); setLayout(new FlowLayout()); add(btn); btn.addActionListener(this); setLocation(200, 100); show(); }
public static void main(String args[]) { new W5(); } public void actionPerformed(ActionEvent e) { new W5(); setLocation(getX()+20, getY()+20); toFront(); }
9.2 菜单 菜单是图形用户界面的重要组成部分。 由菜单条(MenuBar)、菜单(Menu)、菜单项(MenuItem)和复选菜单项(CheckboxMenuItem)等对象组成。
9.2.1 为窗口加入菜单 例9.6 在窗口中添加菜单,如图所示。
import java.awt.*; import java.awt.event.*; public class W6 extends Frame implements ActionListener { Panel p=new Panel(); Button btn=new Button("退出"); MenuBar mb=new MenuBar(); // 以下生成菜单组件对象 Menu m1=new Menu("文件"); MenuItem open=new MenuItem("打开"); MenuItem close=new MenuItem("关闭"); MenuItem exit=new MenuItem("退出");
Menu m2=new Menu("编辑"); MenuItem copy=new MenuItem("复制"); MenuItem cut=new MenuItem("剪切"); MenuItem paste=new MenuItem("粘贴"); Menu m3=new Menu("帮助"); MenuItem content=new MenuItem("目录"); MenuItem index=new MenuItem("索引"); MenuItem about=new MenuItem("关于");
W6() { super("Window6"); setSize(350,200); add("South",p); p.add(btn); btn.addActionListener(this); m1.add(open); // 将菜单项加入到菜单中 m1.add(close); m1.addSeparator(); // 将分隔条加入到菜单中 m1.add(exit); exit.addActionListener(this); // 注册菜单项的事件监听器 mb.add(m1); // 将菜单加入到菜单条中
m2.add(copy); m2.add(cut); m2.add(paste); mb.add(m2); m3.add(content); m3.add(index); m3.addSeparator(); m3.add(about); mb.add(m3);
setMenuBar(mb); // 显示菜单条 show(); } public static void main(String args[]) { new W6(); public void actionPerformed(ActionEvent e) { if (e.getActionCommand()=="退出") System.exit(0);
9.2.2 菜单综合应用 例9.7 菜单综合应用,如图所示。
import java.awt.*; import java.awt.event.*; public class W7 extends Frame implements ActionListener, ItemListener{ TextField msg=new TextField(); MenuBar mb=new MenuBar(); Menu m1=new Menu("菜单"); Menu m2=new Menu("二级菜单"); MenuItem item=new MenuItem("普通菜单项", new MenuShortcut('p')); CheckboxMenuItem checkbox=new CheckboxMenuItem("复选菜单项"); MenuItem exit=new MenuItem("退出");;
W7() { setTitle("菜单综合应用"); setSize(350,200); add(msg); mb.add(m1); m1.add(m2); // 将二级菜单m2加入到m1中 checkbox.setState(true); // 设定复选菜单项为选中 m1.add(item); m1.add(checkbox); m1.addSeparator(); m1.add(exit); m2.add("菜单项A"); // 为二级菜单m2加入菜单项 m2.add("菜单项B");
item.addActionListener(this); // 注册事件监听器 checkbox.addItemListener(this); exit.addActionListener(this); setMenuBar(mb); // 显示菜单 show(); // 显示窗口 } public void actionPerformed(ActionEvent e) { if (e.getSource()==exit) System.exit(0); else msg.setText(e.getActionCommand()+"被打开");
public void itemStateChanged(ItemEvent e) { if (e.getSource()==checkbox) if (checkbox.getState()) msg.setText(checkbox.getLabel()+"被选中"); else msg.setText(checkbox.getLabel()+"被取消"); } public static void main(String arg[]) { new W7();
9.2.3 弹出式菜单 弹出式菜单是一种非常方便的菜单工具,它平常依附在某个容器或组件上并不显现出来,当用户点击鼠标右键时它就会弹出来。
例9.8 弹出式菜单应用,如图所示。
import java.awt.*; import java.awt.event.*; public class W8 extends Frame implements ActionListener, MouseListener { TextArea msg=new TextArea(); PopupMenu pm=new PopupMenu(); MenuItem item1=new MenuItem("复制"); MenuItem item2=new MenuItem("剪切"); MenuItem item3=new MenuItem("粘贴");
W8() { setTitle("弹出式菜单"); setSize(350,200); addWindowListener(new WindowAdapter() { // 注册窗口的事件监听器 public void windowClosing(WindowEvent e) { System.exit(0); } } ); add(msg); msg.add(pm); // 将弹出式菜单加入到文本区中 pm.add(item1); pm.add(item2); pm.add(item3);
item1.addActionListener(this); msg.addMouseListener(this); // 注册文本区的鼠标事件监听器 show(); } public void actionPerformed(ActionEvent e) { msg.append("你选择了"+e.getActionCommand()+"\n");
public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) // 判断是否按下鼠标右键 pm.show(this, e.getX(), e.getY()); // 显示弹出式菜单 } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public static void main(String arg[]) { new W8();
9.3 对话框 对话框是GUI中很常见的窗口对象,有着广泛的应用。 9.3 对话框 对话框是GUI中很常见的窗口对象,有着广泛的应用。 对话框和普通窗口最大的不同就是对话框是依附在某个窗口上,一旦它所依附的窗口关闭了,对话框也要随着关闭。
9.3.1 自定义对话框 Dialog有7个构造方法: ☆Dialog(Dialog owner) ☆ Dialog(Dialog owner, String title) ☆ Dialog(Dialog owner, String title, boolean modal) ☆ Dialog(Frame owner) ☆ Dialog(Frame owner, boolean modal) ☆ Dialog(Frame owner, String title) ☆ Dialog(Frame owner, String title, boolean modal)
9.3.2 创建自定义对话框实例 例9.9 建立一个自定义对话框,如下两 图。
import java.awt.*; import java.awt.event.*; public class W9 extends Frame implements ActionListener { int row=6, col=40; Panel p1=new Panel(), p2=new Panel(); TextArea ta=new TextArea("文本区行数:"+row+" 列数:"+col, row, col); Button exit=new Button("退出"), dialog=new Button("对话框");
W9() { setTitle("对话框的父窗口"); setSize(350,200); add("Center", p1); add("South", p2); p1.add(ta); p2.add(exit); p2.add(dialog); exit.addActionListener(this); dialog.addActionListener(this); setVisible(true); }
public static void main(String args[]) { new W9(); } public void actionPerformed(ActionEvent e) { if (e.getSource()==exit) System.exit(0); else { MyDialog dlg=new MyDialog(this, true); dlg.show();
class MyDialog extends Dialog implements ActionListener { Label label1=new Label("请输入行数"); Label label2=new Label("请输入列数"); TextField rows=new TextField(50); TextField columns=new TextField(50); Button OK=new Button("确定"); Button Cancel=new Button("取消");
MyDialog(W9 parent, boolean modal) { super(parent,modal); setTitle("自定义对话框"); setSize(260,140); setResizable(false); setLayout(null); add(label1); add(label2); label1.setBounds(50,30,65,20); label2.setBounds(50,60,65,20);
add(rows); add(columns); rows.setText(Integer.toString(ta.getRows())); columns.setText(Integer.toString(ta.getColumns())); rows.setBounds(120,30,90,20); columns.setBounds(120,60,90,20); add(OK); add(Cancel); OK.setBounds(60,100,60,25); Cancel.setBounds(140,100,60,25); OK.addActionListener(this); Cancel.addActionListener(this); }
public void actionPerformed(ActionEvent e) { if(e.getSource()==OK) { int row=Integer.parseInt(rows.getText()); int col=Integer.parseInt(columns.getText()); ta.setRows(row); ta.setColumns(col); ta.setText("文本区行数:"+row+" 列数:"+col); } dispose();
9.4 Swing简介 Swing 的功能: ·Swing按钮类和标签类除了显示文本标题外还可以显示图像标题。 ·Swing组件能自动适应操作系统的外观,而AWT组件总是保持相同外观。 ·Swing组件不一定非得是矩形的,可以把按钮设计成圆形。 ·可以调用Swing组件的方法改变其外观和行为。
9.4.1 Swing按钮与标签 例9.10 图像按钮与图像标签应用,如图所示。
import javax.swing.*; import java.awt.*; import java.awt.Color; public class W11 extends JApplet { Container pane; JPanel panel1,panel2; JButton button1,button2,button3; JLabel label;
public void init() { pane=getContentPane(); panel1=new JPanel(new FlowLayout()); panel2=new JPanel(new FlowLayout()); ImageIcon icon = new ImageIcon("PreviousArrow.gif"," "); button1=new JButton(icon); button2=new JButton(new ImageIcon("image/go.GIF")); button3=new JButton(new ImageIcon("NextArrow.gif")); label=new JLabel("图像标签", new ImageIcon("Candl02.gif"),SwingConstants.CENTER);
pane.setBackground(new Color(255,255,204)); panel1.setBackground(new Color(255,255,204)); panel2.setBackground(new Color(255,255,204)); button1.setToolTipText("向上翻页按钮"); button2.setToolTipText("跳转按钮"); button3.setToolTipText("向下翻页按钮");
pane.add(panel1,BorderLayout.NORTH); pane.add(panel2,BorderLayout.SOUTH); panel1.add(button1); panel1.add(button2); panel1.add(button3); panel2.add(label); }
9.4.2 Swing工具栏 例9.11 工具栏与文本区应用,如图所示。
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class W12 extends JFrame implements ActionListener { JButton button1,button2,button3; JToolBar toolBar; JTextArea textArea; JScrollPane scrollPane; JPanel panel; public W12() { super("工具栏按钮"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
button1=new JButton(new ImageIcon("left.gif")); button2=new JButton(new ImageIcon("go.gif")); button3=new JButton(new ImageIcon("right.gif")); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); toolBar=new JToolBar(); toolBar.add(button1); toolBar.add(button2); toolBar.add(button3);
toolBar=new JToolBar(); toolBar.add(button1); toolBar.add(button2); toolBar.add(button3); textArea=new JTextArea(6,30); scrollPane=new JScrollPane(textArea); panel=new JPanel(); setContentPane(panel); panel.setLayout(new BorderLayout()); panel.setPreferredSize(new Dimension(300,150)); panel.add(toolBar,BorderLayout.NORTH); panel.add(scrollPane,BorderLayout.CENTER); pack(); show(); }
public void actionPerformed(ActionEvent e) { String s=""; if (e.getSource()==button1) s="左按钮被单击\n"; else if (e.getSource()==button2) s="中按钮被单击\n"; else if (e.getSource()==button3) s="右按钮被单击\n"; textArea.append(s); } public static void main(String[] args) { new W12();
习 题 1.创建一个窗口对象时要注意什么? 2.使用最简洁的方法创建一个可关闭的窗口。 习 题 1.创建一个窗口对象时要注意什么? 2.使用最简洁的方法创建一个可关闭的窗口。 3.向窗口添加菜单有哪几个步骤?设计一个有“退出”命令的菜单并添加到窗口。 4.创建一个窗口,要求有“退出”按钮、菜单“退出”命令,而且菜单、按钮、窗口本身的关闭按钮都要起作用。 5.如何为菜单添加分隔线?如何创建复选菜单项?如何创建多级菜单? 6.创建一个带有多级菜单和复选框菜单的窗口,并在菜单中加入分隔线。 7.创建一个窗口,单击“提示”按钮可出现一个写有“你好!”文字的标签。 8.将第7题按Swing特性改写。