Chinaunix首页 | 论坛 | 博客
  • 博客访问: 891371
  • 博文数量: 96
  • 博客积分: 10681
  • 博客等级: 上将
  • 技术积分: 2449
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-16 17:52
文章分类

全部博文(96)

文章存档

2011年(30)

2009年(36)

2008年(30)

分类: Java

2011-05-09 12:53:04

8.3 JWindow类

JWindow类与JFrame类类似。他使用JRootPane用于组件管理并且实现了RootPaneContainer接口。他是一个无装饰的顶层窗口。

8.3.1 创建JWindow

JWindow类有五个构造函数:

  1. public JWindow()
  2. JWindow window = new JWindow();
  3. public JWindow(Frame owner)
  4. JWindow window = new JWindow(aFrame);
  5. public JWindow(GraphicsConfiguration config)
  6. GraphicsConfiguration gc = ...;
  7. JWindow window = new JWindow(gc);
  8. public JWindow(Window owner)
  9. JWindow window = new JWindow(anotherWindow);
  10. public JWindow(Window owner, GraphicsConfiguration config)
  11. GraphicsConfiguration gc = ...;
  12. JWindow window = new JWindow(anotherWindow, gc);

我们可以不指定父类或是将父类指定为Frame或Window。如果没有指定父类,则会一个不可见的。

8.3.2 JWindow属性

表8-7列出了JWindow的六个属性。这些属性与JFrame属性类似,所不同的是JWindow没有用于默认关闭操作或是菜单栏的属性。

JWindow属性

属性名
数据类型

访问性

accessibleContext
AccessibleContext

只读

contentPane
Container

读写

glassPane
Component

读写

layeredPane
JLayeredPane

读写

layout
LayoutManager

只写

rootPane
JRootPane

只读


8.3.3 处理JWindow事件

JWindow类在JFrame以及Window类之外并没有添加额外的事件处理功能。查看本章前面的“处理JFrame事件”一节可以了解我们可以关联到JWidnow的监听器列表。

8.3.4 扩展JWindow

如果我们需要扩展JWindow,这个类具有两个重要的protected方法:

  1. protected void windowInit()
  2. protected JRootPane createRootPane()

8.4 JDialog类

JDialog类表示用于显示与Frame相关信息的标准弹出窗口。其作用类似于JFrame,其JRootPane包含一个内容面板以及一个可选的JMenuBar,而且他实现了RootPaneContainer与WidnowConstants接口。

8.4.1 创建JDialog

有11个构造函数可以用来创建JDialog窗口:

  1. public JDialog()
  2. JDialog dialog = new JDialog();
  3.  
  4. public JDialog(Dialog owner)
  5. JDialog dialog = new JDialog(anotherDialog);
  6.  
  7. public JDialog(Dialog owner, boolean modal)
  8. JDialog dialog = new JDialog(anotherDialog, true);
  9.  
  10. public JDialog(Dialog owner, String title)
  11. JDialog dialog = new JDialog(anotherDialog, "Hello");
  12.  
  13. public JDialog(Dialog owner, String title, boolean modal)
  14. JDialog dialog = new JDialog(anotherDialog, "Hello", true);
  15.  
  16. public JDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc)
  17. GraphicsConfiguration gc = ...;
  18. JDialog dialog = new JDialog(anotherDialog, "Hello", true, gc);
  19.  
  20. public JDialog(Frame owner)
  21. JDialog dialog = new JDialog(aFrame);
  22.  
  23. public JDialog(Frame owner, String windowTitle)
  24. JDialog dialog = new JDialog(aFrame, "Hello");
  25.  
  26. public JDialog(Frame owner, boolean modal)
  27. JDialog dialog = new JDialog(aFrame, false);
  28.  
  29. public JDialog(Frame owner, String title, boolean modal)
  30. JDialog dialog = new JDialog(aFrame, "Hello", true);
  31.  
  32. public JDialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc)
  33. GraphicsConfiguration gc = ...;
  34. JDialog dialog = new JDialog(aFrame, "Hello", true, gc);

注意,我们并不需要手动创建JDialog并进行装配,我们将会发现JOptionPane可以为我们自动创建并填充JDialog。我们将会在第9间探讨JOptionPane组件。

每一个构造函数都允许我们自定义对象拥有者,窗口标题以及弹出模式。当JDialog为模态时,他会阻止到其拥有者及程序其余部分的输入。当JDialog为非模态时,他会允许用户与JDialog以及程序的其余部分进行交互。

小心,为了使得对话框模式在不同的Java版本之间正常工作,我们要避免在JDialog中混合使用重量级的AWT组件以及轻量级的Swing组件。

8.4.2 JDialog属性

除了可以设置的图标,JDialog类具有与JFrame类相同的属性。表8-8中列出了这些八个属性。

JDialog属性

属性名
数据类型

访问性

accessibleContext
AccessibleContext

只读

contentPane
Container

读写

defaultCloseOperation
int

读写

glassPane
Component

读写

jMenuBar
JMenuBar

读写

layeredPane
JLayeredPane

读写

layout
LayoutManager

只写

rootPane
JRootPane

只读

用于指定所使用的默认关闭操作的常量是在前面的表8-6中所显示的WidnowConstants(除了EXIT_ON_CLOSE基本相同)。默认情况下,defaultCloseOperation属性设置为HIDE_ON_CLOSE,这是弹出对话框所要求的默认行为。

与JFrame类似,JDialog也有一个静态的defaultLookAndFeelDecorated属性。这可以控制默认情况下对话框是否由观感进行装饰。

8.4.3 处理JDialog事件

并没有需要我们特殊处理的JDialog事件;其事件处理与JFrame类相同。也许我们需要处理的一件与JDialog相关的事情就是指定当按下Escape按键时关闭对话框。处理这一事件的最简单的方法就是向对话框内的JRootPane里的键盘动作注册一个Escape按键,从而可以使得当按下Escape时JDialog变得不可见。列表8-4演示了这一行为。源码中的大部分重复了JDialog的构造函数。createRootPane()方法将Escape按键映射到自定义的Action。

  1. package swingstudy.ch08;
  2.  
  3. import java.awt.Dialog;
  4. import java.awt.Frame;
  5. import java.awt.GraphicsConfiguration;
  6. import java.awt.event.ActionEvent;
  7.  
  8. import javax.swing.AbstractAction;
  9. import javax.swing.Action;
  10. import javax.swing.InputMap;
  11. import javax.swing.JComponent;
  12. import javax.swing.JDialog;
  13. import javax.swing.JRootPane;
  14. import javax.swing.KeyStroke;
  15.  
  16. public class EscapeDialog extends JDialog {
  17.  
  18.     public EscapeDialog() {
  19.         this((Frame)null, false);
  20.     }
  21.  
  22.     public EscapeDialog(Frame owner) {
  23.         this(owner, false);
  24.     }
  25.  
  26.     public EscapeDialog(Frame owner, boolean modal) {
  27.         this(owner, null, modal);
  28.     }
  29.  
  30.     public EscapeDialog(Frame owner, String title) {
  31.         this(owner, title, false);
  32.     }
  33.  
  34.     public EscapeDialog(Frame owner, String title, boolean modal) {
  35.         super(owner, title, modal);
  36.     }
  37.  
  38.     public EscapeDialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc) {
  39.         super(owner, title, modal, gc);
  40.     }
  41.  
  42.     public EscapeDialog(Dialog owner) {
  43.         this(owner, false);
  44.     }
  45.  
  46.     public EscapeDialog(Dialog owner, boolean modal) {
  47.         this(owner, null, modal);
  48.     }
  49.  
  50.     public EscapeDialog(Dialog owner, String title) {
  51.         this(owner, title, false);
  52.     }
  53.  
  54.     public EscapeDialog(Dialog owner, String title, boolean modal) {
  55.         super(owner, title, modal);
  56.     }
  57.  
  58.     public EscapeDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc) {
  59.         super(owner, title, modal, gc);
  60.     }
  61.  
  62.     protected JRootPane createRootPane() {
  63.         JRootPane rootPane = new JRootPane();
  64.         KeyStroke stroke = KeyStroke.getKeyStroke("ESCAPE");
  65.         Action actionListener = new AbstractAction() {
  66.             public void actionPerformed(ActionEvent event) {
  67.                 setVisible(false);
  68.             }
  69.         };
  70.         InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
  71.         inputMap.put(stroke, "ESCAPE");
  72.         rootPane.getActionMap().put("ESCAPE", actionListener);
  73.  
  74.         return rootPane;
  75.     }
  76.  
  77. }

注意,如果我们使用JOptionPane的静态创建方法,则其所创建的JDialog窗口会自动将Escape按键注册为关闭对话框。

8.4.4 扩展JDialog

如果我们需要扩展JDialog,该类具有两个重要的protected方法:

  1. protected void dialogInit()
  2. protected JRootPane createRootPane()

后面的方法在前面的列表8-4中进行了演示。

阅读(2713) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~