只有当你其中的一个JInternalFrame最大化的时候,你才需要消除它的title和边框,
这时你可以在主窗口的menubar里面加入三个按钮,代替JInternalFrame原来那三个按钮
的功能。

解决方案 »

  1.   

    如何在主窗口的menubar里加入3个按钮(还要把他们放在最右边)?另外,如何当JInternalFrame不是最大的时候我点他的最大画按钮的时候能加入我自定义的功能呢(就是把边框去掉,把title去掉)?
      

  2.   

    InternalFrameEvent类的方法:
    getInternalFrame();
    是否可以先得到产生事件的InernalFrame,然后判断这个InternalFrame的状态(max,min or closed)并分别定义你的功能  不过不知道MAX时,应该把功能定义在接口的哪个函数里:
    internalFrameActivated(internalFrameEvent ife)
    internalFrameClosed(internalFrameEvent ife)
    internalFrameClosing(internalFrameEvent ife)
    internalFrameDeactivated(internalFrameEvent ife)
    internalFrameDeiconfied(internalFrameEvent ife)
    internalFrameIconfied(internalFrameEvent ife)
    internalFrameOpened(internalFrameEvent ife)好象只能处理closed的状况,试试继承这个接口,自定义一个
    internalFrameMax(internalFrameEvnet ife)方法
    {
      InternalFrame if = ife.getInternalFrame();
      //再判断if的状态,ismax() , ismin()
    }
      

  3.   

    哎,失败了,不知道为什么!
    interface ExpIntFrame extends InternalFrameListener{
        public void internalFrameMax(InternalFrameEvent event);
      }  class InternalFrameHandler implements ExpIntFrame{
        public void internalFrameMax(InternalFrameEvent event){
          JInternalFrame jif = (JInternalFrame)event.getSource();
          if(jif.isMaximum()){
            jtf.setText("internalFrame maximized!");
          }
        }    public void internalFrameDeiconified(InternalFrameEvent event){}
        public void internalFrameIconified(InternalFrameEvent event){}
        public void internalFrameActivated(InternalFrameEvent event){}
        public void internalFrameClosed(InternalFrameEvent event){}
        public void internalFrameClosing(InternalFrameEvent event){}
        public void internalFrameDeactivated(InternalFrameEvent event){}
        public void internalFrameOpened(InternalFrameEvent event){}  }为什么这样也不能,没有办法捕捉到maximam事件吗?
    InternalFrame类又不是window的子类,无法生成windowevents
      

  4.   

    很奇怪,上面的代码里的
    JInternalFrame jif = (JInternalFrame)event.getSource();
    得到的是以前的jif,当jif打开时就是max时,jtf.settext()就可以显示!
      

  5.   

    我也很奇怪,我使用了以后发现最小化(internalFrameIconified),恢复最小化(internalFrameDeiconified),关闭(internalFrameClosing)都可以监听,就是没有最大化和恢复的监听,打开的监听(internalFrameOpened)似乎也不好用,还有,internalFrameActivated似乎是说当焦点在JInternalFrame中才监听的监听器,对于最大话似乎没有什么用。internalFrameDeactivated和internalFrameActivated正好相反,是当焦点离开的时候的,哪个高手能说一下该如何监听最大化和恢复上次大小的监听呢?jdk给了个例子,不过看上面似乎也没有:(谁做过类似的,出来说说啊
      

  6.   

    看来想监听最大化和恢复事件是不可能的了。
    刚才到sun的forum去翻了翻,没有人解决了这个问题...........
      

  7.   

    我晕,不会吧,别的语言很好实现的怎么到java就难如登天?
      

  8.   

    哈哈,找高手搞定了
    http://www.chinajavaworld.net/non-cgi/usr/6/6_2887_3.rar
    这个是个例子,你可以拿去看看,不过关于如何把最大化和最小化按纽加到menu的最右边我还不知道该如何做,请大家继续帮助
      

  9.   

    感谢!我原来用PB做过把按钮放到MENUBAR的最右边,试试先!
      

  10.   

    总算搞定了,不过可能没有优化代码,只是满足功能先,楼主我可花了一个半小时啊,能不能多送点分?我在升级中:)import javax.swing.*;
    import java.awt.*;
    import javax.swing.event.InternalFrameEvent;
    import javax.swing.event.InternalFrameListener;
    import java.awt.event.*;public class TestFrame extends JFrame  {
      JDesktopPane contentPanel = new JDesktopPane();  OwnInternalFrame maxInternalFrame=null;  OwnMenuBar bar = new OwnMenuBar();  int initX=10,initY=10;
      public TestFrame() {
        this.setSize(600,800);
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(contentPanel,BorderLayout.CENTER);
        this.getContentPane().add(bar,BorderLayout.NORTH);
         for(int i=0;i<3 ;i++){
          createInternalFrame(i);
        }  }private  void  createInternalFrame(int layer){
        JInternalFrame internalFrame = new OwnInternalFrame("test "+layer);
        internalFrame.setMaximizable(true);
        internalFrame.setClosable(true);
        internalFrame.setUI(new OwnBasicInternalFrameUI(internalFrame));
        internalFrame.setBounds(initX, initY, 200, 300);
        initX += 5;
        initY+=5;
        contentPanel.add(internalFrame, layer);
        internalFrame.addInternalFrameListener(new OwnListener(layer));    internalFrame.show();
        javax.swing.plaf.basic.BasicInternalFrameUI dd ;  }
      public static void main(String[] args) {
        TestFrame testFrame = new TestFrame();
        testFrame.show();
      }class OwnInternalFrame extends JInternalFrame{
        OwnInternalFrame(String title){
          super(title);
        }    public void setMaximum(boolean b) throws java.beans.PropertyVetoException{      try{
          super.setMaximum(b);
          String msg = getTitle();
          if(b){
           fireMaxmumEvent(this,true);
          }
          else
            msg+="  is unmaximuming";
          System.out.println(msg);
          }catch(java.beans.PropertyVetoException e){
            throw e;
          }
        }
      }  protected void fireMaxmumEvent(OwnInternalFrame f, boolean b) {
        if(b){
          maxInternalFrame=f;      OwnBasicInternalFrameUI ui = (OwnBasicInternalFrameUI)maxInternalFrame.getUI();
          ui.setTitlePaneVisibale(false);      bar.setActionPanelVisable(true);
        }else{
          if(maxInternalFrame!=null){
           try{         OwnBasicInternalFrameUI ui = (OwnBasicInternalFrameUI)maxInternalFrame.getUI();
             ui.setTitlePaneVisibale(true);
             maxInternalFrame.setMaximum(false);         bar.setActionPanelVisable(false);       }catch(java.beans.PropertyVetoException e){
             e.printStackTrace();
          }
          }
          maxInternalFrame=null;
        }
      }  class OwnBasicInternalFrameUI extends javax.swing.plaf.basic.BasicInternalFrameUI{
        JComponent titlePane;
        OwnBasicInternalFrameUI(JInternalFrame f) {
          super(f);
        }    public void setTitlePaneVisibale(boolean b) {      if(b)
          getNorthPane().setVisible(true);
          else
            getNorthPane().setVisible(false);
        }
      }
      class OwnMenuBar extends JPanel implements ActionListener{
        JPanel actionPanel;    JButton minButton = new JButton("-");
        JButton closeButton = new JButton("X");    public OwnMenuBar(){
          setLayout(new BorderLayout());
          JMenuBar bar = new JMenuBar();
          JMenu menu= new JMenu("File");
          bar.add(menu);
          menu= new JMenu("About");
          bar.add(menu);
          add(bar,BorderLayout.WEST);
          actionPanel = new JPanel();
          actionPanel.setLayout(new FlowLayout());
          actionPanel.add(minButton);
          actionPanel.add(closeButton);
          minButton.addActionListener(this);
          closeButton.addActionListener(this);
          add(actionPanel,BorderLayout.EAST);
          setActionPanelVisable(false);
        }    public void setActionPanelVisable(boolean b){
          actionPanel.setVisible(b);
        }    public void actionPerformed(ActionEvent e){
          if(e.getSource()==closeButton){
            setActionPanelVisable(false);        maxInternalFrame.dispose();        maxInternalFrame=null;
          }
            else
          fireMaxmumEvent(maxInternalFrame,false);    }
      }//只是测试而已 class OwnListener implements InternalFrameListener{
       int index;
       public OwnListener(int i){
         index=i;
       }
      public void internalFrameOpened(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
       System.out.println("InterFrame "+index+" is opened");
      }
      public void internalFrameClosing(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
       System.out.println("InterFrame "+index+" is Closing");
      }
      public void internalFrameClosed(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
        System.out.println("InterFrame "+index+" is Closed");
      }  public void internalFrameIconified(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
         System.out.println("InterFrame "+index+" is Iconified");
      }
      public void internalFrameDeiconified(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
       System.out.println("InterFrame  "+index+" is Deiconified");
      }
      public void internalFrameActivated(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
           System.out.println("InterFrame "+index+" is Activated");
      }
      public void internalFrameDeactivated(InternalFrameEvent e) {
        /**@todo Implement this javax.swing.event.InternalFrameListener method*/
         System.out.println("InterFrame "+index+" is Deactivated");
      } }
    }