认识java中的面板1java中的面板关系和种类如下:2java中的框架(JFrame)
JFrame上可以根据需要加载各种面板,在Swing中的JFrame窗体与AWT中的Frame窗体有一些不同。JFrame由他的窗体本身加上其上的JRootPane根面板,JLayeredPane层面板,containPane内容面板,glassPane玻璃面板,JMenuBar菜单栏(可选,不包括在内)四部分组成。其中根面板在JRootPane类中实现,层面板在JLayeredPane类中实现,他们都是JComponent的子类。而containPane和glassPane没有专门对应的类。
3各种面板(或称窗格)的关系及作用:JRootPane根面板:该面板是在JFrame窗体创建时就默认添加进来的,是所有其他面板的载体或父级,他覆盖窗体的除标题栏和边条之外的整个表面。根面板默认是不可见的。根面板负责管理其他面板(层面板,玻璃面板),如使其他面板覆盖整个JFrame窗体等。
JLayeredPane层面板:该面板是其他所有面板的父级,在JRootPane面板的上面,他再次覆盖窗体的整个表面,内容面板和JMenuBar菜单栏被添加到层面板上。当添加了菜单栏时,菜单栏被添加到JLayeredPane面板的顶部,剩下的部分被内容面板填充。层面板是分很多层的,每一层使用一个相应的数字来表示,而内容面板就位于层面板中的某一层,在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板将负责管理各种内部窗体的叠放问题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。层面板的内容后面会作具体介绍。
containPane内容面板:由层面板的介绍可知,内容面板是层面板中的某一层。默认的内容面板是不透明的,而且是一个JPane对象。该面板在窗体中起着工作区的作用,当我们向窗体添加组件时就应该添加到这一层上,而不能像AWT那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件无法显示。比如要添加按钮jb则正确的方式为,Container p=jframegetContentPane(); padd(jr); 或jframegetContentPane()add(jr); 其中getContentPane()是JFrame类中的方法,该方法将反回内容面板的引用,这是访问默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。
glassPane玻璃面板:该面板总是存在的,而且他位于最上面,默认情况下玻璃面板是不可见的,玻璃面板用于接收鼠标事件和在其他组件上绘图。
互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们、经济、生活等各个方面发挥着重要的作用。网页设计伴随着网络的快速发展而快速兴起,作为上网的主要依托,由于人们使用网络的频繁而变得非常的重要。网页讲究的是排版布局,其功能主要就是提供一种形式给每个上网者,让他们能够了解提供的信息。
一、网页设计的要素
在一个中,最重要的页面当属主页,所以在此以主页为例,说明在网页中版面设计的问题。从版面设计来讲,一个有特色的主页,必须包含有四个要素:文字,,排列方式和主色调,这四者相辅相成,缺一不可。
1要素
要设计出漂亮的主页,首先要成为计算机图形高手,仅这一点就可以让初学者花上一年半载的时间。的要求与页面的内容有关,一些较随意的主页像股票、医药站点等,来访者并不在乎你能否做出精彩的,有些时候他们反而觉得放置图象后影响了访问速度,他们关心的只是页面内容;相反像一些需要靠图象来吸引访客的主页,如游戏介绍、影视介绍、风光名胜等站点,图象是一个极为重要的要素,在这里缺少了恰当的图象,整个页面就会黯然失色、就是一个不完整的主页。这需要去学习像photoshop这样的图形图像处理软件,还要有一定的美术基础,如审美观、创意技巧等,
2排列方法要素
主页的第二个要素是排列方法,即网页布局。网页作为一种版面,既有文字,又有;文字有大有小,还有标题和正文之分;页有大小而且有横竖之别。和文字都需要同时展示给观众,不能简单地将其罗列在一个页面上,否则会搞得杂乱无章。关于具体的网页布局,常见的有“国”字型、拐角型、标题正文型、左右框架型、上下框架型、综合框架型、封面型、Flash型、变化型等,关于它们,在网页设计的相关书籍中或者在网络上都可以看到详细的叙述。比如如果内容非常多,就要考虑用“国字型”或拐角型;而如果内容不算太多而一些说明性的东西比较多,则可以考虑标题正文型;而如果是一个企业想展示一下企业形象或个人主页想展示个人风采,封面性是首选;Flash型更灵活一些,好的Flash大大丰富了网页,但是它不能表达过多的文字信息。还没有提到的就是变化型了,只有不断的变化才会提高,才会不断丰富我们的网页。
3色彩要素
色彩在网页所占比重很大。有了合理清新的色调,会弥补主页上的其它不足。页面的色彩搭配是与的主题分不开的,一个必须有一种或两种主题色。不至于让浏览者迷失方向,也不至于单调乏味。一般来说,页面的主体文字应尽量使用黑色等较深的颜色,与背景对比明显,按钮、边框等使用彩色。例如教育类使用蓝色为主题色,再用红色和黑色作为配色,就能表达出严肃、稳重的效果。
二、网页设计技巧
一张完美的主页设计需要积累丰富的知识以及掌握大量的技巧。在这里笔者从框架和CSS样式的运用两方面来介绍网页设计的技巧。
1框架的使用
FRAME(框架)是Web上经常会看到的页面结构。框架的最常见用途就是导航。一组框架通常包括一个含有导航条的框架和另一个要显示主要内容页面的框架。
使用框架具有以下优点:访问者的浏览器不需要为每个页面重新加载与导航相关的图形;每个框架都具有自己的滚动条(如果内容太大,在窗口中显示不下),因此访问者可以滚动这些框架。例如,当框架中的内容页面较长时,如果导航条位于不同的框架中,那么向下滚动到页面底部的访问者就不需要再滚动回顶部来使用导航条。
使用框架具有以下缺点:可能难以实现不同框架中各元素的精确图形对齐;对导航进行测试可能很耗时间。
许多专业Web设计人员不喜欢使用框架,并且许多浏览Web的人也不喜欢框架。在大多数情况下,这种反感是因为遇到了那些使用框架效果不佳或不必要地使用框架的站点(例如,每当访问者单击导航按钮时就重新加载导航框架内容的框架集)。如果框架使用得法(例如,在允许其他框架的内容发生更改的同时,使一个框架中的导航控件保持静态),则这些框架对于某些站点可能非常有用。
2CSS样式的使用
CSS(层叠样式表)是一种网页的新技术,它的全称是级联样式表,即CascadingStyleSheets的缩写,又称之为风格样式表单。CSS是在网页过程中普遍用到的技术。采用了CSS技术控制的网页,设计者会更轻松、有效地对页面的整体布局、颜色、字体、链接、背景以及同一页面的不同部分、不同页面的外观和格式等效果实现更加精确地控制。
三、网页设计经验谈
一般的来说,绝大多数普通受众图形,插件,applets和其它有关的高级Web浏览器特性。对我们来说,页面的实用可能比漂亮更重要,对于用户来说,没有什么比页面能够快速下载更重要了,简而言之,精简你的站点,这是一条最佳的捷径。
另外还要注意,不要依赖图形。就站点设计而言,的确能够通过成功的图形设计招徕或者丢失访问者。并非所有的访问者可以完全看到,某些人为了加快存取网络的速度已经关闭了浏览器端的图形。简而言之,图形并不能正确的在客户端加载。然而,图形经常被用来作为导航按钮。
第三要注意,仅仅在需要的时候使用帧(FRAME)。使用帧可以把一个浏览器分成几个不同的窗口,对于站点的结构的把握是一个不错的方法。但是,你还是必须知道,还是有人在使用不支持帧的浏览器。在你开始打算设计一个帧的时候,你该仔细的考虑考虑你是否的确真的需要。经常,你这样的需求可以通过表格来组织站点的结构。
网页设计涉及到对多种软件、多种知识的学习和应用,以及个人的审美观等等。所以要想出漂亮的网页,需要一个逐步学习和经验积累的过程。网页设计还有更多的技巧,有待于我们去挖掘和研究。
CChildFrame做为子窗口包含于MDIClient中(可以包含多个),CChildFrame里面则是真实的文档表示窗口CMDITestView了。 我们从这里开始:// CMDITestApp 初始化BOOL CMDITestApp::InitInstance() 做为CWinApp的派生类,通常需要重载InitInstance(), ExitInstance()两个函数,以完成应用的初始化和退出。我们现在关心InitInstance中关于文档模板、窗口处理的部分,而忽略掉一些CommonControl, OLE初始化部分。 整个InitInstance代码如下:BOOL CMDITestApp::InitInstance(){ InitCommonControls(); // 这里删减了大量注释和错误处理 CWinApp::InitInstance(); AfxOleInit(); AfxEnableControlContainer(); SetRegistryKey(_T(“应用程序向导生成的本地应用程序“)); LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU) TRACE(“Before CMultiDocTemplate\n“); // 注册应用程序的文档模板。文档模板 // 将用作文档、框架窗口和视图之间的连接 CMultiDocTemplate pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MDITestTYPE, RUNTIME_CLASS(CMDITestDoc), RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 RUNTIME_CLASS(CMDITestView)); if (!pDocTemplate) return FALSE; TRACE(“Before AddDocTemplate\n“); AddDocTemplate(pDocTemplate); // 创建主 MDI 框架窗口 TRACE(“Before new CMainFrame\n“); CMainFrame pMainFrame = new CMainFrame; TRACE(“Before pMainFrame->LoadFrame\n“); if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; TRACE(“Before ParseCommandLine\n“); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 调度在命令行中指定的命令。如果 // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。 TRACE(“Before ProcessShellCommand\n“); if (!ProcessShellCommand(cmdInfo)) return FALSE; TRACE(“Before pMainFrame->ShowWindow\n“); // 主窗口已初始化,因此显示它并对其进行更新 pMainFrame->ShowWindow(m_nCmdShow); TRACE(“Before pMainFrame->UpdateWindow\n“); pMainFrame->UpdateWindow(); return TRUE;} 为了研究整个创建过程,我在其中添加了一些TRACE来跟踪创建顺序。 忽略掉开始的乱七八糟的初始化,从CMultiDocTemplate开始: CMultiDocTemplate pDocTemplate = new CMultiDocTemplate(IDR_MDITestTYPE, RUNTIME_CLASS(CMDITestDoc), RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 RUNTIME_CLASS(CMDITestView)); AddDocTemplate(pDocTemplate);(作了一点点简化)这里首先创建了一个CMultiDocTemplate ——文档模板,文档模板包括的三个运行时刻类信息:Document – CMDITestDoc, FrameWnd – CChildFrame, View – CMDITestView。然后通AddDocTemplate函数将新创建的文档模板添加到模板管理器之中(我们以后再研究模板管理器)。 然后创建主框架窗口CMainFrame: CMainFrame pMainFrame = new CMainFrame; if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; 其中,需要研究的是LoadFrame的实现,以及里面都做了些什么。我们稍后研究。 处理命令行,在这里第一个空文档被建立出来: CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 调度在命令行中指定的命令。如果用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。 if (!ProcessShellCommand(cmdInfo)) // �0�8 这里创建出初始空文档 return FALSE; 我们一会会重点研究ProcessShellCommand。 最后,显示主窗口: pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); 至此,WinApp::InitInstance()完成了自己的工作。 上面遗留了三个待研究的分支,让我们现在去研究它们:1、 CDocTemplate2、 CFrameWnd::LoadFrame3、 CWnd::ProcessShellCommand 研究CDocTemplate 我们的例子中是构造了一个CMultiDocTemplate,它是从CDocTemplate派生而来,所以我们主要研究CDocTemplate。CDocTemplate的几个关键属性列表如下: CRuntimeClass m_pDocClass; // class for creating new documents CRuntimeClass m_pFrameClass; // class for creating new frames CRuntimeClass m_pViewClass; // class for creating new views 其中:m_pDocClass表示文档类类型,在此例子中就是CMDITestDocm_pFrameClass表示容纳View窗口的框架窗口类类型,此例中为CChildFramem_pViewClass表示显示文档的View视类类型,此例中为CMDITestView 我们可以这样认为,CDocTemplate用于描述Frame-View-Doc的关系。当然它还有一大堆别的属性,我们暂时先忽略。 一会还会看到CDocTemplate的创建文档、框架、视的过程,<在ProcessShellCommand中研究。 研究LoadFrame 让我们继续研究CFrameWnd::LoadFrame是怎么运作的。使用的方法是跟踪进入。。。BOOL CMDIFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd pParentWnd, CCreateContext pContext){ // 调用基类 CFrameWnd 的 LoadFrame, pContext 在创建主窗口时 = NULL // pParentWnd = NULL if (!CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) return FALSE; // save menu to use when no active MDI child window is present ASSERT(m_hWnd != NULL); // 主窗口带有菜单,所以。。。 m_hMenuDefault = ::GetMenu(m_hWnd); if (m_hMenuDefault == NULL) TRACE(traceAppMsg, 0, “Warning: CMDIFrameWnd without a default menu\n“); return TRUE;}注意,我们的MDITest Application的主窗口CMainFrame是从CMDIFrameWnd派生的,所以进入到这里,参考代码中红色的注释部分。继续跟踪进入CFrameWnd::LoadFrame。 BOOL CFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd pParentWnd, CCreateContext pContext){ // only do this once ASSERT_VALID_IDR(nIDResource); // nIDResource = 128, IDR_MAINFRAME ASSERT(m_nIDHelp == 0 || m_nIDHelp == nIDResource); m_nIDHelp = nIDResource; // ID for help context (+HID_BASE_RESOURCE) CString strFullString; if (strFullStringLoadString(nIDResource)) // = “MDITest” AfxExtractSubString(m_strTitle, strFullString, 0); // 取得第一个子串 VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)); // attempt to create the window // GetIconWndClass 会调用 virtual PreCreateWindow 函数,别处也会调用,从而 // 使得子类的PreCreateWindow 将被调用多次 LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource); CString strTitle = m_strTitle; // 调用 CFrameWnd::Create() 实际创建出窗口。 // 注意:在这里将给 CMainFrame 发送 WM_CREATE 等多个消息。触发 CMainFrame 的 // OnCreate 处理等。 if (!Create(lpszClass, strTitle, dwDefaultStyle, rectDefault, pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext)) { return FALSE; // will self destruct on failure normally } // save the default menu handle, 好像CMDIFrameWnd 也保存了一次? ASSERT(m_hWnd != NULL); m_hMenuDefault = ::GetMenu(m_hWnd); // load accelerator resource LoadAccelTable(MAKEINTRESOURCE(nIDResource)); // WM_INITIALUPDATE 是 MFC 发明的消息,参见后面的说明。 if (pContext == NULL) // send initial update SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE); return TRUE;} 以下是从TN024: MFC-Defined Messages And Resources中抽取的部分说明:WM_INITIALUPDATEThis message is sent by the document template to all descendants of a frame window when it is safe for them to do their initial update It maps to a call to CView::OnInitialUpdate but can be used in other CWnd-derived classes for other one-shot updatingwParamNot used (0)lParamNot used (0)returnsNot used (0) 归纳一下,LoadFrame中进行了如下事情:1、 注册窗口类(AfxDeferRegisterClass)2、 实际创建窗口(Create)3、 处理菜单、快捷键,发送WM_INITIALUPDATE消息给所有子窗口。实际将在CView中处理此消息。(例如:在ToolBar上面放一个FormView,可能就能收到这个消息并处利?) 至此,CMainFrame已经成功创建,菜单已经装载,工具条、状态行等已经在CMainFrame::OnCreate中创建。让我们接着研究第一个子窗口是怎么被创建出来的,该过程和CMainFrame::LoadFrame比起来就不那么直接了。 研究CWnd::ProcessShellCommand 第一个MDI子窗口是从这里面建立出来的,这实在是缺乏直观性。不过MFC就是这样,没办法。BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo){ BOOL bResult = TRUE; switch (rCmdInfom_nShellCommand) { case CCommandLineInfo::FileNew: if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)) // 关键是这里 OnFileNew(); if (m_pMainWnd == NULL) bResult = FALSE; break; case CCommandLineInfo::FileOpen: // 忽略 case CCommandLineInfo::FilePrintTo: // 忽略 case CCommandLineInfo::FilePrint: case CCommandLineInfo::FileDDE: case CCommandLineInfo::AppRegister: case CCommandLineInfo::AppUnregister: } return bResult;}进入到ProcessShellCommand,要处理很多种不同命令,我们忽略其它命令,单独看FileNew部分。注意:实际进入到了AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)之中。 AfxGetApp()实际返回了CMDITestApp的唯一实例,它从CWinApp – CWinThread – CCmdTarget – CObject 派生而来。我们没有重载OnCmdMsg,所以进入到CCmdTarget的OnCmdMsg处理中。为了研究,我们删减了一些代码。BOOL CCmdTarget::OnCmdMsg(UINT nID, int nCode, void pExtra, AFX_CMDHANDLERINFO pHandlerInfo){ // 这里删减了一些代码 // determine the message number and code (packed into nCode) const AFX_MSGMAP pMessageMap; const AFX_MSGMAP_ENTRY lpEntry; UINT nMsg = 0; // 这里删减了一些代码,处理后 nMsg = WM_COMMAND // 为了简化,删减了一些断言等。以下循环用于查找处理此消息的入口。
以上就是关于在java中面板和框架什么区别全部的内容,包括:在java中面板和框架什么区别、网页设计的要素有什么、学习MFC框架如何创建的过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)