问题:窗体在运行时显示,在解决方案管理器中不显示

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WKX18330698534/article/details/50917054

小引:

    虽然我知道实现《机房收费管理系统》会遇见各种问题,但是碰到这么狗血的问题,我真是大姑娘上花轿——头一回!

果:

   某天,具体时间忘了,只记得上了节课回来,就发现我刚做好的《机房收费系统》的frmMain窗体在解决方案资源管理器中找不到了,但是运行的时候却能正常的显示出来,当下我就郁闷了。本来一天的专业课,好不容易挤出时间,把界面显示做出来了,菜单栏也用英文名命名了,现在可好,啥也看不见了,难道要重来吗!呜呜呜。。。

因:

   因为我的洁癖,见不得“没用的”代码,将窗体中的一句话删了,直接造成了上面的结果,真是后患无穷啊!我到底是删了什么东西,这么神奇?

答案:


Public Class frmMain
End Class 


回想我的解决方法是:

第一,确定是因为自己的哪步修改引起的?

   记忆中,我是在修改了frmMain窗体的IsMdiContainer属性为true后,保存了就去上课了。下课回来再打开程序时就看不见了,所以,我又新建了一个窗体,将它的IsMdiContainer属性设置为true,我想,一山不容二虎,肯定会报错吧,结果发现自己对VS还是不够理解,在同一个解决方案中可以同时存在两个父窗体。所以,没报错。。。此时我已半疯,心里滴血~半天的功夫可能要没了,要重新做了。。。不行,再试试——

第二,对比窗体内部代码,观察我的窗体和新生成的有什么不一样!

    当然,从外观上看,我的frmMain窗体现在只剩下一个光杆类库了,如图:






   打开新建的窗体,发现在frm类中有这样一句话:

Public Class frm
End Class
   而我的类frmMain中没有,难道真的是因为这句话?算啦,死虎当活虎医,抱着试试看的态度,我把代码一改:用到我的frmMain大老虎上,不到5秒的时间,药到病除,活力重现,frmMain老虎和其他的老虎一样一样的啦。

Public Class frmMain
End Class 



为什么我的“洁癖”会造成我的大老虎生病呢?

选中
Public Class frmMain
End Class 


按F1查找帮助,找到了最醒目的一段话:


   仔细一想,以前老师介绍过:我们使用的窗体其实就是封装好的类,我们使用的VS工具和VB工具在窗体上就是应用了面向对象的思想,直接将窗体为我们封装好,不用我们再用代码画一个个的“画”控件,在以前,要想做出程序,要先用代码“画”出窗体,才能真正开始写和程序运行有关的代码;
   但是,我将类frmMain.vb直接删掉,在显示上,窗体frmMain 就直接不存在了,只剩下一个类库,但是在我的在运行时却可以显示出来,而且能进行操作,在程序文件组成的UI部分,还能看见frmMain.Designer.vb,如图:


到底是谁控制窗体在运行时显示,又是谁让窗体在解决资源管理器中不显示了呢?

经过查资料终于知道了:


   FrmMain.vb 是指类代码。FrmMain.Designer.vb 是指界面设计代码。在 VB 2003 和之前的.net版本中这两部分是在一起的,从 VB 2005 以后才分开。也就是说,在之前的IDE里面,IDE将Designer.vb里面的代码全部放在窗体代码文件开头。

   简单的来说 .Designer.vb 保存的是用户界面设计自动生成的代码,里面写着的是比如 Form 的高度宽度啊、窗体上有个 TextBox 的 Text 啊之类这些东西,这些东西用户在 IDE 中只需要用鼠标去画并修改相应的控件属性就可以了,VS 会自动生成相应的代码保存到 Designer.vb 中。

在FrmMain.Designer.vb中,我们可以看见这样的描述:




相关解释:

   partial 信息只对编译器有用,编译器在编译时看到对某个类的描述是“碎”的(partial 的),它会去其他地方收集该类的其他碎片,然后把所有的该类的碎片组合成完整的一个类,再对其编译。-- @jizhongbo 简单地说就是我们可以把类写在不同的文件中,类名相同,用partial修饰后,IDE会找全类的碎片,然后粘在一块儿,形成完整的一个类。

我的理解:

   我们的frmMain.vb和frmMain.Designer.vb就是将一个类放在了不同的文件中,我将frmMain.vb删除后,“窗体类”在重组时不完整,便在右边的解决方案资源管理器中不显示了。但是因为一个“窗体类”负责显示的部分在FrmMain.Designer.vb,我删除的是frmMain.vb,所以没有影响窗体在运行时显示。

小结:

   尽管查资料和整理博客用的时间可以让我再重新建一个MDI窗体了,但是如果没有查资料的过程,就不会有现在的知识上的收获,有的更多的是对VS的胆怯和对自己当时的“傻”的懊悔。


了解更多frm.Designer.vb 的知识,向大家推荐:http://tieba.baidu.com/p/1822178540#


展开阅读全文

窗体关闭按钮不显示

10-22

[img=https://img-bbs.csdn.net/upload/201310/22/1382433813_586055.jpg][/img]rn[code=java]rnrnimport java.awt.BorderLayout;rnimport java.awt.Color;rnimport java.awt.Insets;rnimport java.awt.event.ActionEvent;rnimport java.awt.event.ComponentAdapter;rnimport java.awt.event.ComponentEvent;rnimport java.beans.PropertyVetoException;rnimport java.lang.reflect.Constructor;rnimport java.util.HashMap;rnimport java.util.Map;rnrnimport javax.swing.AbstractAction;rnimport javax.swing.Action;rnimport javax.swing.Icon;rnimport javax.swing.ImageIcon;rnimport javax.swing.JDesktopPane;rnimport javax.swing.JFrame;rnimport javax.swing.JInternalFrame;rnimport javax.swing.JLabel;rnimport javax.swing.JMenu;rnimport javax.swing.JMenuBar;rnimport javax.swing.JMenuItem;rnimport javax.swing.SwingConstants;rnimport javax.swing.SwingUtilities;rnimport javax.swing.UIManager;rnimport javax.swing.event.InternalFrameAdapter;rnimport javax.swing.event.InternalFrameEvent;rnrnimport net.hlj.hqtt.listerner.AddMoneyListerner;rnimport net.hlj.hqtt.listerner.UserCedeListerner;rnrnpublic class Main rn public static JDesktopPane desktopPane;rnrn private static JFrame frame;rnrn private JLabel backLabel;rnrn public static Map ifs = new HashMap();rnrn public Main() rnrn frame = new JFrame("管理系统");rn frame.setBounds(0, 0, 1000, 700);rn frame.getContentPane().setBackground(new Color(170, 188, 120));rnrn frame.getContentPane().setLayout(new BorderLayout());rnrn frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);rn frame.setTitle("管理系统");rn JMenuBar menubar1 = new JMenuBar();// 添加菜单条组件rn frame.setJMenuBar(menubar1);// 将菜单条添加到顶层容器中rn JMenu menu1 = new JMenu("会员卡管理"); // 设置菜单组件rn JMenu menu2 = new JMenu("商品管理");rn JMenu menu4 = new JMenu("会员卡管理 ");rn JMenu menu3 = new JMenu("系统管理");rn menubar1.add(menu1);// 将菜单组件添加到菜单条组件中rn menubar1.add(menu2);rn menubar1.add(menu4);rn menubar1.add(menu3);rn rn // JMenuItem item1 = new JMenuItem("网上会员开卡");// 创建菜单项组件rnrn JMenuItem item3 = new JMenuItem("会员过户");rn JMenuItem item4 = new JMenuItem("充值");rn menu1.add(createFrameButton("老会员开卡", "user.OldUserCardFrame"));rn menu1.add(createFrameButton("新会员开卡", "user.NewUserCardFrame"));rn menu1.add(createFrameButton("挂失", "user.UserCardLossFrame"));rn menu1.add(createFrameButton("解除挂失", "user.UserCardUnLossFrame"));rn menu1.add(createFrameButton("补卡", "user.UserSecondCardFrame"));rn menu1.add(createFrameButton("消卡", "user.UserCardCancelFrame"));rn menu1.add(createFrameButton("积分转存", "user.UserScoreTrunFrame"));rn rnrn // menu1.add(item1); // 将菜单项组件添加到相应的菜单组件中去rnrn menu1.addSeparator();// 菜单项之间的分割线组件rn menu1.add(item3);rn menu1.add(item4);rn menu1.addSeparator();rnrn // JMenuItem item2_1 = new JMenuItem("购买商品");rn // menu2.add(createFrameButton("购买商品", "goods.BuyGoodsFrame"));rnrn menu2.add(createFrameButton("添加商品", "goods.AddGoodsFrame"));rnrn menu2.add(createFrameButton("退货管理", "goods.BackGoodsFrame"));rnrn JMenuItem item2_4 = new JMenuItem("购买商品");rn menu2.add(createFrameButton("销售查询", "goods.QuerySaleFrame"));rn item2_4.addActionListener(new BuyGoodsListerner());rn item3.addActionListener(new UserCedeListerner());rn item4.addActionListener(new AddMoneyListerner());rn menu2.add(createFrameButton("商品管理", "goods.QueryGoodsFrame"));rn JMenuItem item2_6 = new JMenuItem("购买商品3");rn menu3.add(createFrameButton("关于我们", "sys.AboutFrame"));rn menu3.add(createFrameButton("更新数据", "sys.UpdateSQL"));rn menu2.add(item2_4);rn menu4.add(createFrameButton("充值记录", "goods.QueryCardListFrame"));rn menu4.add(createFrameButton("消费记录", "goods.QueryCardSaleListFrame"));rnrn // menu2.add(item2_6);rnrn backLabel = new JLabel();// 背景标签rn backLabel.setVerticalAlignment(SwingConstants.TOP);rn backLabel.setHorizontalAlignment(SwingConstants.CENTER);rn updateBackImage(); // 更新或初始化背景图片rn desktopPane = new JDesktopPane();rn desktopPane.add(backLabel, new Integer(Integer.MIN_VALUE));rn frame.getContentPane().add(desktopPane);rn frame.setVisible(true);rn rnrn public static void main(String args[]) rnrn SwingUtilities.invokeLater(new Runnable() rn public void run() rn new Main();rn rn );rn rnrn /** *********************辅助方法************************* */rn // 为内部窗体添加Action的方法rn private JMenuItem createFrameButton(String fName, String cname) rn String imgUrl = "res/ActionIcon/" + fName + ".png";rn String imgUrl_roll = "res/ActionIcon/" + fName + "_roll.png";rn String imgUrl_down = "res/ActionIcon/" + fName + "_down.png";rn Icon icon = new ImageIcon(imgUrl);rn Icon icon_roll = null;rn if (imgUrl_roll != null)rn icon_roll = new ImageIcon(imgUrl_roll);rn Icon icon_down = null;rn if (imgUrl_down != null)rn icon_down = new ImageIcon(imgUrl_down);rn Action action = new openFrameAction(fName, cname, icon);rn JMenuItem button = new JMenuItem(action);rn button.setMargin(new Insets(0, 0, 0, 0));rnrn button.setFocusPainted(false);rn button.setBorderPainted(false);rn button.setContentAreaFilled(false);rn if (icon_roll != null)rn button.setRolloverIcon(icon_roll);rn if (icon_down != null)rn button.setPressedIcon(icon_down);rn return button;rn rnrn // 获取内部窗体的唯一实例对象rn private JInternalFrame getIFrame(String frameName) rn JInternalFrame jf = null;rn if (!ifs.containsKey(frameName)) rn try rn Class fClass = Class.forName("net.hlj.hqtt.frame." + frameName);rn Constructor constructor = fClass.getConstructor(null);rn jf = (JInternalFrame) constructor.newInstance(null);rn jf.setClosable(true);rn jf.setMaximizable(true);rn jf.setResizable(true);rn jf.isOpaque();rn ifs.put(frameName, jf);rn catch (Exception e) rn e.printStackTrace();rn rn elsern jf = ifs.get(frameName);rn jf.setClosable(true);rn jf.setMaximizable(true);rn jf.setResizable(true);rn jf.isOpaque();rn rn return jf;rn rnrn // 更新背景图片的方法rn private void updateBackImage() rn if (backLabel != null) rn int backw = Main.this.frame.getWidth();rn int backh = frame.getHeight();rn backLabel.setSize(backw, backh);rn backLabel.setText("");rn System.out.println(Main.this.getClass().getResource("welcome.jpg"));rn rn rnrn // 窗体监听器rn private final class FrameListener extends ComponentAdapter rn public void componentResized(final ComponentEvent e) rn updateBackImage();rn rn rnrn // 主窗体菜单项的单击事件监听器rn protected final class openFrameAction extends AbstractAction rn private String frameName = null;rnrn private openFrameAction() rn rnrn public openFrameAction(String cname, String frameName, Icon icon) rn this.frameName = frameName;rn putValue(Action.NAME, cname);rn putValue(Action.SHORT_DESCRIPTION, cname);rn // putValue(Action.SMALL_ICON, icon);rn rnrn public void actionPerformed(final ActionEvent e) rn JInternalFrame jf = getIFrame(frameName);rn // 在内部窗体闭关时,从内部窗体容器ifs对象中清除该窗体。rn jf.addInternalFrameListener(new InternalFrameAdapter() rn public void internalFrameClosed(InternalFrameEvent e) rn ifs.remove(frameName);rn rn );rn if (jf.getDesktopPane() == null) rn desktopPane.add(jf);rn jf.setVisible(true);rn rn try rn jf.setSelected(true);rn catch (PropertyVetoException e1) rn e1.printStackTrace();rn rn rn rnrn static rn try rn UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());rn catch (Exception e) rn e.printStackTrace();rn rn rnrn[/code]rnrn 论坛

没有更多推荐了,返回首页