我用的Eclipse 进行Java 编程,做了一个界面。界面整体采用JSplitPane实现左右分割的布局,左半部分是JTree,右半部分采用的是CardLayout的布局,每一个部分都是一个JPanel。可以实现点击左端JTree的相应部分,看到相对应的Jpanel,并进行操作。我的问题在于,我点击整个JFrame的关闭按钮,会卡死,之后再点击任何部分都无效。
注意:this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);主界面的关闭函数我已经加了。
对于JPanel的初始化部分如下:
private void initJp() {
jp.setLayout(cl); //设置为卡片布局
jp.add(jlRoot,"Root");
jp.add(new CaDishSearch(),"ds");//相应对象待添加
jp.add(new CaTakeAway(),"cata");
jp.add(new CaAdviceView(),"av");

}
其中jp为JPanel的对象,cl为卡片布局对象具体为: CardLayout cl = new CardLayout(); 
而CaDishSearch(),CaTakeAway(),CaAdviceView(),都是继承自JPanel的对象,在同一个包里面加以定义了。
求教遇到或了解这一问题的高手指导,高级不仅。javaeclipse关闭Frame

解决方案 »

  1.   

    我要做的是一个简单的餐厅管理系统,下面是我的JFrame的主要代码。
    /**
     * 餐厅管理系统管理员所见视图类 
     */
    package seu.Client.view;import java.awt.CardLayout;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Image;import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;//import sun.security.mscapi.KeyStore.ROOT;
    public class CanteenAdminView extends JFrame { /**
     * 
     */
    private static final long serialVersionUID = 1L;
    DefaultMutableTreeNode[] dmtn =    //创建节点数组
    {new DefaultMutableTreeNode(new NodeValue("管理员操作选择") ),
    new DefaultMutableTreeNode(new NodeValue("菜品管理") ),
    new DefaultMutableTreeNode(new NodeValue("外卖管理") ),
    new DefaultMutableTreeNode(new NodeValue("意见查看") ),
    new DefaultMutableTreeNode(new NodeValue("退出") )
    };
    DefaultTreeModel dtm =  new DefaultTreeModel(dmtn[0]);//指定根节点为SEU餐厅管理系统
    JTree jt = new JTree(dtm);
    JScrollPane jsp = new JScrollPane(jt); //为JTree创建活动窗口
    private JSplitPane jsplr = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);//创建左右分割窗体对象
    private JPanel jp = new JPanel();
    Image image = new ImageIcon(this.getClass().getResource("/image/images.jpg")).getImage();
    ImageIcon ii = new ImageIcon(image);
    private JLabel jlRoot = new JLabel(ii);
    //private Manager mg;
    String mgNO;                //管理员ID
    CardLayout cl = new CardLayout(); //创建卡片布局对象
    public CanteenAdminView(String mgNO){ //构造器
    this.mgNO = mgNO;
    //this.setResizable(false);设置界面不可调
    this.initJp();
    this.addTreelistener();
    for (int i =1;i<5;i++){
    dtm.insertNodeInto(dmtn[i], dmtn[0], i-1);
    }
    jt.setEditable(false); //设置树中节点可编辑
    this.getContentPane().add(jsplr); //添加滚动窗口
    jsplr.setLeftComponent(jt);
    jp.setBounds(200, 50, 600, 500);
    jsplr.setRightComponent(jp);
    jsplr.setDividerLocation(200);
    jsplr.setDividerSize(4);
    jlRoot.setFont(new Font("Courier",Font.PLAIN,30));
    jlRoot.setHorizontalAlignment(JLabel.CENTER);
    jlRoot.setVerticalAlignment(JLabel.CENTER);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Image image = new ImageIcon(this.getClass().getResource("/image/canteenIcon.png")).getImage();//logo初始化
    this.setIconImage(image);
    this.setTitle("餐厅管理系统 --管理员");
    java.awt.Toolkit tk = this.getToolkit();
    Dimension screenSize = tk.getScreenSize(); //获得屏幕尺寸
    int centerX = screenSize.width/2;
    int centerY = screenSize.height/2;
    int w = 1250;
    int h = 600;
    this.setBounds(centerX-w/2,centerY-h/2-100,w,h);
    this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    this.setVisible(true);
    jt.setShowsRootHandles(true);

    }
    /**
     * @param args
     */
    //public static void main(String[] args) {
    // new CanteenAdminView("zyl"); //}
    private void addTreelistener() { //为树添加选择模型的监听器
    jt.addTreeSelectionListener(new TreeSelectionListener() {

    public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode cdmtn = (DefaultMutableTreeNode)e.getPath().getLastPathComponent();
    NodeValue cnv = (NodeValue)cdmtn.getUserObject();//得到自定义节点对象
    if(cnv.value.equals("管理员操作选择")){
    cl.show(jp, "root");
    }
    if(cnv.value.equals("菜品管理")){
    cl.show(jp, "ds");
    }
    else if(cnv.value.equals("外卖管理")){
    cl.show(jp, "cata");
    }
    else if(cnv.value.equals("意见查看")){
    cl.show(jp, "av");
    }
    else if(cnv.value.equals("退出")){
    //System.out.println("退出");
    System.exit(0);
    }
    }

    });
    } private void initJp() {
    jp.setLayout(cl); //设置为卡片布局
    jp.add(jlRoot,"Root");
    jp.add(new CaDishSearch(),"ds");//相应对象待添加
    jp.add(new CaTakeAway(),"cata");
    jp.add(new CaAdviceView(),"av");

    }
    class NodeValue{//自定义节点对象字符属性
    String value;
    public NodeValue(String value){
    this.value = value;
    }
    public String getValue(){
    return this.value;
    }
    public String toString(){ //重写toString方法
    return value;
    }
    }}