浅析Swing实现MDI的方法

开发 后端
本文介绍Swing实现MDI风格界面的基础是JInternalFrame和JDesktopPane。以及介绍Swing实现MDI的方法。
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是一个MDI风格的Java桌面应用。Swing实现MDI风格界面的基础是JInternalFrame和JDesktopPane。以下是Swing实现MDI的方法:
  1. import java.awt.BorderLayout;  
  2. import java.awt.Container;  
  3. import java.awt.Dimension;  
  4. import java.awt.FlowLayout;  
  5. import java.awt.Insets;  
  6. import java.awt.event.ActionEvent;  
  7. import java.awt.event.ActionListener;  
  8. import java.awt.event.ComponentAdapter;  
  9. import java.awt.event.ComponentEvent;  
  10. import java.beans.PropertyVetoException;  
  11.  
  12. import javax.swing.JButton;  
  13. import javax.swing.JDesktopPane;  
  14. import javax.swing.JFrame;  
  15. import javax.swing.JInternalFrame;  
  16. import javax.swing.JMenuBar;  
  17. import javax.swing.JMenuItem;  
  18. import javax.swing.JPanel;  
  19. import javax.swing.SwingUtilities;  
  20. import javax.swing.plaf.basic.BasicInternalFrameUI;  
  21.  
  22. /**  
  23. * MDIFrame is a frame using JInternalFrame to implements MDI as Word on Windows.  
  24. *   
  25. * @author Cheng  
  26. * @version 1.0.0 for GPF MDI test  
  27. */  
  28. @SuppressWarnings("serial")  
  29. public class MDIFrame extends JFrame {  
  30.    
  31.     /** The desktop pane. */  
  32.     final JDesktopPane desktopPane = new JDesktopPane();  
  33.    
  34.     /** The operation pane with restore and close buttons. */  
  35.     final JPanel opPane = new JPanel();  
  36.    
  37.     /**  
  38.      * Instantiates a new mDI frame.  
  39.      */  
  40.     public MDIFrame(){  
  41.       setTitle("MDI Frame");  
  42.       setSize(600, 550);  
  43.       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  44.     
  45.       final JMenuBar bar = new JMenuBar();  
  46.       JMenuItem exit = new JMenuItem("Exit");  
  47.           exit.addActionListener(new ActionListener(){  
  48.  
  49.               @Override  
  50.               public void actionPerformed(ActionEvent e) {  
  51.                    System.exit(0);  
  52.               }  
  53.      
  54.       });  
  55.       bar.add(exit);  
  56.       // operation pane with two button, set invisible at first  
  57.       opPane.setLayout(new FlowLayout(FlowLayout.TRAILING));  
  58.       JButton restore = new JButton("#");  
  59.       restore.setMargin(new Insets(0, 0, 0, 0));  
  60.       restore.setPreferredSize(new Dimension(15, 15));  
  61.       restore.addActionListener(new ActionListener(){  
  62.  
  63.       @Override  
  64.       public void actionPerformed(ActionEvent e) {  
  65.             InnerFrame i = (InnerFrame)desktopPane.getSelectedFrame();  
  66.             try {  
  67.                 // notice this method, when JInternalFrame set maximun false  
  68.                 // this internal frame will be set as old size  
  69.                 i.setMaximum(false);  
  70.             } catch (PropertyVetoException ex) {  
  71.                 ex.printStackTrace();  
  72.             }  
  73.             i.showNorthPanel();  
  74.             opPane.setVisible(false);  
  75.           }  
  76.      
  77.       });  
  78.       opPane.add(restore);  
  79.       JButton close = new JButton("X");  
  80.       close.setMargin(new Insets(0, 0, 0, 0));  
  81.       close.setPreferredSize(new Dimension(15, 15));  
  82.       close.addActionListener(new ActionListener(){  
  83.  
  84.           @Override  
  85.           public void actionPerformed(ActionEvent e) {  
  86.             JInternalFrame i = desktopPane.getSelectedFrame();  
  87.             i.dispose();  
  88.             opPane.setVisible(false);  
  89.           }  
  90.      
  91.       });  
  92.       opPane.add(close);  
  93.       bar.add(opPane);  
  94.       opPane.setVisible(false);  
  95.       setJMenuBar(bar);  
  96.     
  97.       Container content = getContentPane();  
  98.       content.add(desktopPane, BorderLayout.CENTER);  
  99.       final JPanel ctrlPane = new JPanel();  
  100.       JButton add = new JButton("add");  
  101.       add.addActionListener(new ActionListener(){  
  102.  
  103.           @Override  
  104.           public void actionPerformed(ActionEvent e) {  
  105.               InnerFrame iFrame = new InnerFrame();  
  106.               iFrame.setVisible(true);  
  107.               desktopPane.add(iFrame);  
  108.           }  
  109.      
  110.       });  
  111.       ctrlPane.add(add);  
  112.       content.add(ctrlPane, BorderLayout.SOUTH);  
  113.       setVisible(true);  
  114.     }  
  115.    
  116.     /**  
  117.      * The Class InnerFrame.  
  118.      */  
  119.     class InnerFrame extends JInternalFrame {  
  120.     
  121.       /** The is hidden. */  
  122.       boolean isHidden = false;  
  123.     
  124.       /** The old ui. */  
  125.       BasicInternalFrameUI oldUi = null;  
  126.     
  127.       /**  
  128.        * Instantiates a new inner frame.  
  129.        */  
  130.       public InnerFrame() {  
  131.           oldUi = (BasicInternalFrameUI)getUI();  
  132.           setSize(200, 200);  
  133.           maximizable = true;  
  134.           closable = true;  
  135.           addComponentListener(new ComponentAdapter() {  
  136.               public void componentResized(ComponentEvent e) {  
  137.                   InnerFrame selectedFrame = (InnerFrame)e.getSource();  
  138.                   if(selectedFrame.isMaximum()){  
  139.                       selectedFrame.hideNorthPanel();  
  140.                       opPane.setVisible(true);  
  141.                       try {  
  142.                            selectedFrame.setMaximum(true);  
  143.                       } catch (PropertyVetoException ex) {  
  144.                            ex.printStackTrace();  
  145.                        }  
  146.                    }  
  147.                }  
  148.           });  
  149.       }  
  150.     
  151.       /**  
  152.        * Hide north panel.  
  153.        */  
  154.       public void hideNorthPanel(){  
  155.           ((BasicInternalFrameUI) this.getUI()).setNorthPane(null);  
  156.           this.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);  
  157.           isHidden = true;  
  158.       }  
  159.     
  160.       /**  
  161.        * Show north panel.  
  162.        */  
  163.       public void showNorthPanel() {  
  164.           this.setUI(oldUi);  
  165.           this.putClientProperty("JInternalFrame.isPalette", Boolean.FALSE);  
  166.           isHidden = false;  
  167.       }  
  168.     
  169.       /* (non-Javadoc)  
  170.        * @see javax.swing.JInternalFrame#updateUI()  
  171.        */  
  172.       public void updateUI() {  
  173.           super.updateUI();  
  174.           if (isHidden) {  
  175.               hideNorthPanel();  
  176.           }  
  177.        }  
  178.     }  
  179.    
  180.     /**  
  181.      * The main method.  
  182.      *   
  183.      * @param args the arguments  
  184.      */  
  185.     public static void main(String[] args) {  
  186.           SwingUtilities.invokeLater(new Runnable(){  
  187.  
  188.               @Override  
  189.               public void run() {  
  190.                    new MDIFrame();  
  191.               }  
  192.      
  193.           });  
  194.      }  
  195. }  

以上是Swing实现MDI的方法,希望大家有用。

【编辑推荐】

  1. 浅谈不论是AWT还是Swing模式
  2. 全面比较Swing与SWT
  3. Swing程序中调用JavaFX代码
  4. 概述Swing大多数控件
  5. 浅谈Swing中的Look&Feel
责任编辑:佚名 来源: 电子工业出版社
相关推荐

2009-07-17 16:41:48

actionPerfoSwing

2009-07-17 11:30:44

Swing Image

2009-07-15 11:02:32

Swing组件

2009-07-16 09:54:44

LookupEventSwing线程

2009-07-10 10:37:50

Swing Set示例

2009-07-10 14:20:01

AcceleratorJava Swing

2009-07-15 16:50:07

Swing项目

2009-07-15 13:46:26

Swing体系结构

2009-07-15 16:03:26

Swing线程

2009-07-16 17:01:09

Swing字符串

2009-09-28 10:35:45

Silverlight

2009-09-07 09:36:29

C# DisposeDispose方法

2009-07-14 14:00:47

iData技术

2009-07-15 17:33:08

Swing客户端

2009-07-10 17:24:07

Swing应用程序

2012-01-17 17:21:24

JavaSwing

2009-07-14 15:12:36

SwingSWT和AWT

2009-09-17 08:47:00

Linq插入数据

2009-10-12 10:33:11

Javascript替

2009-12-23 09:04:41

LINQ通用分页
点赞
收藏

51CTO技术栈公众号