请问,现在有两个顶层窗体frame1和frame2  当关闭frame2窗体的时候,这两个窗体全都关闭了,我用的是System.exit(0); 退出虚拟机,我现在只想关闭frame2,保留frame1,如何处理呢?能否赐教一下。还有当我点击frame1窗体的小X时,能不能关闭窗体,但不退出程序,就象MSN似的,有托盘图标,双击后应用程序还能出来。 窗体上面的java的咖啡杯子的小图标,能不能换,代码怎么写,不好意思一下问这么多问题,希望高手赐教,最好以代码来加以说明。

解决方案 »

  1.   

    java托盘化的代码如下,但是你要点X实现托盘化就要对相应事件进行额外处理import java.awt.*;
    import java.io.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.imageio.ImageIO;public class Test extends JFrame{
        private TrayIcon trayIcon;//托盘图标
        private SystemTray systemTray;//系统托盘
             
        public Test()
        {
            super("系统托盘图标");
            systemTray = SystemTray.getSystemTray();//获得系统托盘的实例 
            setSize(150,150); 
                    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    this.setVisible(true);    
            try {
                trayIcon = new TrayIcon(ImageIO.read(new File("0.gif")));
                systemTray.add(trayIcon);//设置托盘的图标,0.gif与该类文件同一目录
            }
            catch (IOException e1) {e1.printStackTrace();}
            catch (AWTException e2) {e2.printStackTrace();}
            
            this.addWindowListener(
                    new WindowAdapter(){   
                        public void windowIconified(WindowEvent e){   
                            dispose();//窗口最小化时dispose该窗口 
                        }   
                    });
            
            trayIcon.addMouseListener(
                    new MouseAdapter(){
                        public void mouseClicked(MouseEvent e){
                            if(e.getClickCount() == 2)//双击托盘窗口再现
                                setExtendedState(Frame.NORMAL);
                                setVisible(true);
                        }
                    });        
        }       public static void main(String args[])
        {
            new Test();
        }
    }
      

  2.   

    关闭frame2不要用System.exit(0); 用this.dispose();
      

  3.   

    public Test(){
    Frame f = new Frame("Test");
    f.setLayout(null);
    tf = new TextArea();
    f.add(tf);
    tf.setLocation(40,60);
    tf.setSize(190,125);
    f.setSize(450,250);
    f.setBackground(new Color(90,145,145,200));
    f.setVisible(true);
    f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
                                            
    如果不用//System.exit();用this.dispose();
    代码如何来写,小弟初学,麻烦高手赐教。
    }
    });
    }
      

  4.   

    public Test(){ 
    Frame f = new Frame("Test"); 
    f.setLayout(null); 
    tf = new TextArea(); 
    f.add(tf); 
    tf.setLocation(40,60); 
    tf.setSize(190,125); 
    f.setSize(450,250); 
    f.setBackground(new Color(90,145,145,200)); 
    f.setVisible(true); 
    f.addWindowListener(new WindowAdapter(){ 
    public void windowClosing(WindowEvent e){ 
    System.exit(0); } 
    }); 
    }
                                            
    如果不用//System.exit();用this.dispose(); 
    代码如何来写,小弟初学,麻烦高手赐教。 其中Test是内部类。
      

  5.   


    1、System.exit(0)退出本虚拟机。
       如果向关闭frame2,首先要设置frame2.setDefaultExitOperation(JFrame.EXIT_ON_CLOSE);
       再调用frame2.dispose()销毁本窗口。2、可以做到程序托盘化,但是老的JDK版本是无法做到的。
       关于上面可以提供给你一个思路,首先设置frame1添加windows监听,判断用户点击关闭按钮的时候,设置frame1.setVisible(false),再系统托盘上添加显示程序界面的菜单,调用时设置frame1.setVisible(true).
       至于代码,可以参考5楼的。下面是SWT的托盘实现,你可以根据自己的需要进行修改。
    import org.eclipse.swt.SWT; 
    import org.eclipse.swt.graphics.Image; 
    import org.eclipse.swt.widgets.Display; 
    import org.eclipse.swt.widgets.Event; 
    import org.eclipse.swt.widgets.Listener; 
    import org.eclipse.swt.widgets.Menu; 
    import org.eclipse.swt.widgets.MenuItem; 
    import org.eclipse.swt.widgets.Shell; 
    import org.eclipse.swt.widgets.Tray; 
    import org.eclipse.swt.widgets.TrayItem; 
    public class Test { 
    public static void main(String[] args) { 
            Display display = new Display(); 
            Shell shell = new Shell(display); 
            Image image = new Image(display, 16, 16); 
            final Tray tray = display.getSystemTray(); 
            if (tray == null) { 
                System.out.println("The system tray is not available"); 
            } else { 
                final TrayItem item = new TrayItem(tray, SWT.NONE); 
                item.setToolTipText("SWT TrayItem"); 
                item.addListener(SWT.Show, new Listener() { 
                    public void handleEvent(Event event) { 
                        System.out.println("show"); 
                    } 
                }); 
                item.addListener(SWT.Hide, new Listener() { 
                    public void handleEvent(Event event) { 
                        System.out.println("hide"); 
                    } 
                }); 
                item.addListener(SWT.Selection, new Listener() { 
                    public void handleEvent(Event event) { 
                        System.out.println("selection"); 
                    } 
                }); 
                item.addListener(SWT.DefaultSelection, new Listener() { 
                    public void handleEvent(Event event) { 
                        System.out.println("default selection"); 
                    } 
                }); 
                final Menu menu = new Menu(shell, SWT.POP_UP); 
                for (int i = 0; i < 8; i++) { 
                    MenuItem mi = new MenuItem(menu, SWT.PUSH); 
                    mi.setText("Item" + i); 
                    mi.addListener(SWT.Selection, new Listener() { 
                        public void handleEvent(Event event) { 
                            System.out.println("selection " + event.widget); 
                        } 
                    }); 
                    if (i == 0) 
                        menu.setDefaultItem(mi); 
                } 
                item.addListener(SWT.MenuDetect, new Listener() { 
                    public void handleEvent(Event event) { 
                        menu.setVisible(true); 
                    } 
                }); 
                item.setImage(image); 
            } 
            shell.setBounds(50, 50, 300, 200); 
            shell.open(); 
            while (!shell.isDisposed()) { 
                if (!display.readAndDispatch()) 
                    display.sleep(); 
            } 
            image.dispose(); 
            display.dispose(); 
        } 
    }