`
EdwardWorld
  • 浏览: 28356 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Swing为什么不受重视

阅读更多

我想在JavaEye发表一些Swing的技术文章,都不知道发布到哪个板里去,JavaEye好像完全无视Java GUI的存在,连一个专门的板块都没有。

我觉得Swing还是非常值得学习和应用的,比如我现在的工作,就是做工作流系统,GUI部分就是使用Swing做的。
 
国外Swing应用很广泛,NetBeans是使用Swing做的,Oracle9i的管理平台应该也是基于Swing的。

Java不只是用来做web的,Java的GUI技术也很成熟,非常值得提倡和应用,一提到Java GUI,大家普遍感觉就是慢,是的,比起C++的QT之类的GUI技术,Java是慢了,但是如果想采用跨平台的GUI界面,其实我们可以选择的并不多,QT开放协议刚刚有所放开,SWT跨平台性,事实证明并不理想,所以除了Swing,如果想做跨平台GUI,还真没多少可选择的方案,不过最重要的是,Swing并不像你想象的那么不堪,Swing其实也可以做出很复杂的界面。
所以建议JavaEye开一个Java GUI的板块,以供我们这些做Java Desktop软件的人来参与到JavaEye之中。

纠错:我在跟帖中说QT编写的软件release版体积近百兆,这么表述是错误的,因为我把调试的QtCored4.dll(17.8兆)和QtGuid4.dll(64.3兆)也计算在内了,这两个动态链接库不是必须的,特此纠正,感谢各位朋友的热烈讨论。

 

  • 大小: 549.5 KB
分享到:
评论
243 楼 rainv 2012-08-28  
Java要是加个配置选项让自己能释放对象就好了。new delete
242 楼 rainv 2012-08-28  
喜欢swing的继续给swing加油吧,呵呵。我也是学过swing,swing慢我感觉就是Java虚拟机的自动内存回收没做好引起的,和Java执行效率没关系。Java让我又爱又恨啊。
241 楼 ihaokan 2012-06-29  
橡树心 写道
国外还是比较重视Swing的,很多项目的都是用Swing在做,用Jbuilder和NetBeans生成的界面,代码部分很难阅读,但是手写布局效率又很低,我感觉只要解决这个问题,Swing还是很有前途的,我曾经做过国外的一个项目就是用Swing+XML布局完成的,客户要求不能用可视化工具编写GUI,只能手写,运算速度也不慢,但就是开发效率太低了,50%的缺陷都是跟界面布局有关的,Swing用的好,做出来的效果相当漂亮。

唉,那个jtable把我折腾死了,超浪费时间啊。
240 楼 xiaosa032715 2010-04-18  
zkgale 写道
周五,我们公司开会,
经理有句话:
我们现在接项目,只找BS,要是有点象CS的,我们都不做...


哈哈哈哈,有点意思
239 楼 fnet 2010-04-18  
唯B/S万岁的家伙可能不知道,

国内很多大公司的ERP的C/S产品都是Swing的。

唯SSH的家伙可能不知道,

很多产品和平台都是基于RPC+EJB。
238 楼 Ceil 2010-04-07  
事实上在Jre 1.7试用版出现之后Swing的速度提升了很多啊......
Netbeans的启动时间也缩短了一半.
237 楼 HeDYn 2010-04-06  
renxiaoya0 写道
shiren1118 写道
revivemydark 写道
其实swing最重要的就是两点:
1,applet ,
2,opengl ,
可惜sun这两方面都没做好,就算现在做好了也晚了



applet本身是没有问题的,问题出在jre的体积


其实现在已经不能算问题了,很多人连内存都不用释放,还在乎那点硬盘空间吗?


java2D ,3D都还可以,opengl 好像是有第三方实现


是啊,最致命的是jre的体积,导致部署极困难(不包括企业应用),
javafx还有applet不知道怎么搞,还要下个十几兆的jre,一两兆的网速下完要十几分钟,安装也要几分钟,干脆去死好了


你下载过.net3.5没?安装过.net没?
236 楼 HeDYn 2010-04-06  
tcrct 写道
如果swing能够将发布时的JRE精简的话,估计反对的声音会少很多。

相比较.net 3.5 的几百M,jre已经非常精简了
235 楼 meiowei 2010-04-06  
geminiyellow 写道
…………一年前的帖子,你们真能挖。

前两天用WPF做了一下那些水晶按钮。
比起用Swing做出好看的界面让人激动的感觉来说,
WPF真的不让我激动,好像是必须的。

不过swing情节还是有的。毕竟第一个工程就是拿Swing做界面。

WPF你也可以把它扯进来,用WPF画了一个工作流画面,现在想起来,泪流满面
234 楼 hypercube1024 2010-04-06  
EdwardWorld 写道
EdwardWorld 写道
vlinux 写道
swing的所有组建都是画出来的,所以我们可以很方便的进行hack,我局限于仅仅知道Java的UI,所以这点不知道算不算他的优势。

话说回来,在RCP衰败的年代,为什么要坚守这个阵地呢?
BOSS的管理界面都在向WEB迈进了,一个短信发送平台为啥还要坚持呢?
工作流用WEB不也一样可以做么,而且更易于使用和维护,如果你不是为了之前的项目,为什么还要坚持呢?

想起JavaEye之前有个帖子是在说:我们讨论XX技术是否NX的时候,一定要统一下双方的需求范围,否则在这个领域Swing很有用,但是到了另外一个领域却一无是处。我觉得他说得是非常有道理的,所以就你所涉及到的短信发送平台而言,我个人认为用Swing是很不划算的哦


如果我需要调用本地的dll来控制硬件,web能做到么?

如果我需要加载硬件驱动程序,控制传真卡发送传真,web能做到么?
如果我需要从FTP上下载几千个文本文件,然后ETL导入本地数据库,web能做到么?
如果我想通过shell控制Linux服务器,web能做到么?
如果我想定时执行存储过程,web能做到么?这一条可能web能做到,但是如果我需要自动向存储过程传递的参数值是通过读取本地文本文件里的内容,web能做到么?
这些功能,在我目前参与的工作流系统里,都是最基本的功能,如果使用web开发,你能做到么?
最后,如果使用纯web,你连画流程那个界面都实现不了,假如你非要用JavaScript来实现,那么我问你,你的JavaScript代码量比Swing少么?恐怕要比Swing复杂程度多出一个数量级。

B/S 和C/S本来就是各有所长,如果你非要把一切都使用web来代替,能代替得了还说得过去,关键是有些功能你根本就代替不了,最简单的例子就是,你使用web来开发一个IDE试试。


你说的这些貌似现在都有web版的啊,包括IDE
233 楼 iooyoo 2010-04-02  
觉得swing支持工具还是不够吧
232 楼 tottichen 2010-04-01  
zkgale 写道
周五,我们公司开会,
经理有句话:
我们现在接项目,只找BS,要是有点象CS的,我们都不做...

公司和公司之间不一样的嘛,不过你们老板有点强悍的。
231 楼 darkblue086 2010-04-01  
觉得SWING多个方面都有待提升,速度慢是不可否认的,说别人有快的理由(调用windows库之类)也白搭,慢就是慢,你升级了机器变快了,可是我的机器就是慢,别的开发出来的程序就很快,咋整?
然后是IDE部分,不如VS的强大和易用,搞不好手写更慢,VS开发全界面手写的是不多的……
最后是默认的界面方面,对于最终用户来说和其他的软件都不同,很丑,不容易被接受。
功能大家都有,各种软肋一摆,你想要酷炫.net的也能啊,跨平台还有MONO,所以他不被接受的情况是很明显的
230 楼 鸟哥哥 2010-03-30  
橡树心 写道
国外还是比较重视Swing的,很多项目的都是用Swing在做,用Jbuilder和NetBeans生成的界面,代码部分很难阅读,但是手写布局效率又很低,我感觉只要解决这个问题,Swing还是很有前途的,我曾经做过国外的一个项目就是用Swing+XML布局完成的,客户要求不能用可视化工具编写GUI,只能手写,运算速度也不慢,但就是开发效率太低了,50%的缺陷都是跟界面布局有关的,Swing用的好,做出来的效果相当漂亮。

是的,国外很多用swing写项目的。布局那些,netbeans帮你搞定了。
用netbeans生出的代码:

mainPanel = new javax.swing.JPanel();
        。。。
        fileChooser = new javax.swing.JFileChooser();

        mainPanel.setName("mainPanel"); // NOI18N

        treeScrollPane.setName("treeScrollPane"); // NOI18N

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("书名");
        struct.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        struct.setEnabled(false);
        struct.setName("struct"); // NOI18N
        NodeData nd = new NodeData();
        nd.setContent("");
        nd.setName("书名");
        this.selectedNodeData = nd;
        data.put("[" + String.valueOf(treeNode1) + "]", nd);
        struct.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                structMouseReleased(evt);
            }
        });
        struct.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                structValueChanged(evt);
            }
        });
        treeScrollPane.setViewportView(struct);

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(com.ebookmaker.EbookMaker.class).getContext().getResourceMap(EbookMakerView.class);
        nodeName.setText(resourceMap.getString("nodeName.text")); // NOI18N
        nodeName.setToolTipText(resourceMap.getString("nodeName.toolTipText")); // NOI18N
        nodeName.setBorder(javax.swing.BorderFactory.createTitledBorder(null, resourceMap.getString("nodeName.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("宋体", 0, 12), resourceMap.getColor("nodeName.border.titleColor"))); // NOI18N
        nodeName.setEnabled(false);
        nodeName.setName("nodeName"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        content.setColumns(20);
        content.setLineWrap(true);
        content.setRows(5);
        content.setBorder(javax.swing.BorderFactory.createTitledBorder(null, resourceMap.getString("content.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("宋体", 0, 12), resourceMap.getColor("content.border.titleColor"))); // NOI18N
        content.setEnabled(false);
        content.setName("content"); // NOI18N
        jScrollPane1.setViewportView(content);
        content.getDocument().addDocumentListener(new DocumentChangedListener());

        ok.setText(resourceMap.getString("ok.text")); // NOI18N
        ok.setEnabled(false);
        ok.setName("ok"); // NOI18N
        ok.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                okActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addComponent(treeScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(10, 10, 10)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(ok, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 573, Short.MAX_VALUE)
                    .addComponent(nodeName, javax.swing.GroupLayout.PREFERRED_SIZE, 146, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, mainPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(treeScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 453, Short.MAX_VALUE))
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addGap(20, 20, 20)
                        .addComponent(nodeName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 348, Short.MAX_VALUE)
                        .addGap(18, 18, 18)
                        .addComponent(ok)))
                .addContainerGap())
        );

        nodeName.getDocument().addDocumentListener(new DocumentChangedListener());

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setMnemonic('F');
        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        openProject.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        openProject.setText(resourceMap.getString("openProject.text")); // NOI18N
        openProject.setName("openProject"); // NOI18N
        openProject.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openProjectActionPerformed(evt);
            }
        });
        fileMenu.add(openProject);

        newProject.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        newProject.setText(resourceMap.getString("newProject.text")); // NOI18N
        newProject.setName("newProject"); // NOI18N
        newProject.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newProjectActionPerformed(evt);
            }
        });
        fileMenu.add(newProject);

        projectSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        projectSave.setText(resourceMap.getString("projectSave.text")); // NOI18N
        projectSave.setName("projectSave"); // NOI18N
        projectSave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                projectSaveActionPerformed(evt);
            }
        });
        fileMenu.add(projectSave);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(com.ebookmaker.EbookMaker.class).getContext().getActionMap(EbookMakerView.class, this);
        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setText(resourceMap.getString("exitMenuItem.text")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        editMenu.setMnemonic('E');
        editMenu.setText(resourceMap.getString("editMenu.text")); // NOI18N
        editMenu.setName("editMenu"); // NOI18N

        itemAdd.setText(resourceMap.getString("itemAdd.text")); // NOI18N
        itemAdd.setEnabled(false);
        itemAdd.setName("itemAdd"); // NOI18N
        itemAdd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemAddActionPerformed(evt);
            }
        });
        editMenu.add(itemAdd);

        itemDelete.setText(resourceMap.getString("itemDelete.text")); // NOI18N
        itemDelete.setEnabled(false);
        itemDelete.setName("itemDelete"); // NOI18N
        itemDelete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemDeleteActionPerformed(evt);
            }
        });
        editMenu.add(itemDelete);

        itemMoveUp.setText(resourceMap.getString("itemMoveUp.text")); // NOI18N
        itemMoveUp.setEnabled(false);
        itemMoveUp.setName("itemMoveUp"); // NOI18N
        itemMoveUp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMoveUpActionPerformed(evt);
            }
        });
        editMenu.add(itemMoveUp);

        itemMoveDown.setText(resourceMap.getString("itemMoveDown.text")); // NOI18N
        itemMoveDown.setEnabled(false);
        itemMoveDown.setName("itemMoveDown"); // NOI18N
        itemMoveDown.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMoveDownActionPerformed(evt);
            }
        });
        editMenu.add(itemMoveDown);

        menuBar.add(editMenu);

        helpMenu.setMnemonic('H');
        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setText(resourceMap.getString("aboutMenuItem.text")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        statusPanel.setName("statusPanel"); // NOI18N

        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 738, Short.MAX_VALUE)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 568, Short.MAX_VALUE)
                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(statusAnimationLabel)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(statusMessageLabel)
                    .addComponent(statusAnimationLabel)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
        );

        popupMenu.setName("popupMenu"); // NOI18N
        popupMenu.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                popupMenuFocusLost(evt);
            }
        });

        itemAdd1.setText(resourceMap.getString("itemAdd1.text")); // NOI18N
        itemAdd1.setName("itemAdd1"); // NOI18N
        itemAdd1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemAdd1ActionPerformed(evt);
            }
        });
        popupMenu.add(itemAdd1);

        itemDelete1.setText(resourceMap.getString("itemDelete1.text")); // NOI18N
        itemDelete1.setName("itemDelete1"); // NOI18N
        itemDelete1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemDelete1ActionPerformed(evt);
            }
        });
        popupMenu.add(itemDelete1);

        itemMoveUp1.setText(resourceMap.getString("itemMoveUp1.text")); // NOI18N
        itemMoveUp1.setName("itemMoveUp1"); // NOI18N
        itemMoveUp1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMoveUp1ActionPerformed(evt);
            }
        });
        popupMenu.add(itemMoveUp1);

        itemMoveDown1.setText(resourceMap.getString("itemMoveDown1.text")); // NOI18N
        itemMoveDown1.setName("itemMoveDown1"); // NOI18N
        itemMoveDown1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMoveDown1ActionPerformed(evt);
            }
        });
        popupMenu.add(itemMoveDown1);

        fileChooser.setName("fileChooser"); // NOI18N
        fileChooser.setFileFilter(new FileNameExtensionFilter("ebookMaker项目文件","em"));

        setComponent(mainPanel);

        setMenuBar(menuBar);
        setStatusBar(statusPanel);



这也不算难看吧,也是可以读懂的,只是读懂的意义也不大,开发的内容不用心这些。像后面的一些action,它是在另外帮你生成一个方法,这方法里你可以任意写上自己的处理代码。
同时,像fileChooser这些:fileChooser.setFileFilter(new FileNameExtensionFilter("ebookMaker项目文件","em"));是自己加上过滤器上去的,虽然不可以直接在上面自动生成的代码改,可是却可以自己订制代码的。
代码太多了,不知道能不能发出去。。
229 楼 橡树心 2010-03-30  
国外还是比较重视Swing的,很多项目的都是用Swing在做,用Jbuilder和NetBeans生成的界面,代码部分很难阅读,但是手写布局效率又很低,我感觉只要解决这个问题,Swing还是很有前途的,我曾经做过国外的一个项目就是用Swing+XML布局完成的,客户要求不能用可视化工具编写GUI,只能手写,运算速度也不慢,但就是开发效率太低了,50%的缺陷都是跟界面布局有关的,Swing用的好,做出来的效果相当漂亮。
228 楼 geminiyellow 2010-03-30  
…………一年前的帖子,你们真能挖。

前两天用WPF做了一下那些水晶按钮。
比起用Swing做出好看的界面让人激动的感觉来说,
WPF真的不让我激动,好像是必须的。

不过swing情节还是有的。毕竟第一个工程就是拿Swing做界面。
227 楼 ray_linn 2010-03-29  
EdwardWorld 写道
Visual Studio所需要的GUI类库,在Windows启动的时候,已经加载完毕,所有的微软的程序都是调用使用Windows本身已经加载到内存中的类库,随意非常快是正常的,就是100G的软件打开



这段东西,每一句都是错。


Windows内核里有几个本来不应该进内核的东东(从老学究的观点来看),user模块和gdi模块等等,其中gdi模块屏蔽了硬件设备的不同,为Windows程序提供了统一的图形接口服务(不是图形接口)。这部分东西存在你电脑的win32k.sys。

真正提供接口的是GDI.dll,这些就是我们通常说的Win32 API,GDI.DLL的真正实现,则是存在于Win32K.sys,Win32K.sys存在于内核态中,GDI.dll存在于用户态中。

每当Windows创建一个进程,无论是visual studio进程,还是java进程,每一个进程都拥有GDI模块、user模块、驱动等等的一个拷贝,对于VS和Java来用,都是公平的。


我们说的类库,MFC之类的,则是GDI Win32接口的高层接口,并不存在预先加载的问题。

GDI是Windows绘制图形的标准接口,你以为Swing可以脱离GDI在Windows上绘制图形吗?


麻烦去好好学习一下,windows内核有什么,进程里有什么, GDI是什么,类库是什么?不要信口开河。


纠正一下:Visual studio编辑器本身并不大,Microsoft Visual Studio 2008 Shell (isolated mode)是个类似Eclipse的东东,可以让客户用VS的壳开发各种东西。比如nemerle studio,C#,C++,VB等等,可以看做类似VS的插件,只是VS的插件机制似乎比Eclipse好,我装了许多个之后,并没有像Eclipse一样,明显慢了下来。


比如楼主那个工作流系统(最大亮点就是那些水晶按钮),就完全可以利用VS shell来开发,省许多时间。



226 楼 鸟哥哥 2010-03-29  
以后会用netbeans开发,开发动编,地编(有个叫tiled的开源项目就是居于swing的)等。也可能做桌面游戏吧。桌面游戏的话用的不多,表面上也就JFrame,JTextField,Graphics,JOptionPane,Event吧。游戏里的所用东西用Graphics画,收入框用JTextFiled(因为涉及到收入法).JOptionPane在JFrame点X时,弹出是否退出的confirm。说swing不行的,去网上找找,现在有多少java swing写的游戏了。
225 楼 鸟哥哥 2010-03-29  
起初,我用netbeans开发半年j2me,卡是卡,但能接受。后来换一台机子,只因有了独显。现在再也不卡了。swing是需要显卡支持的。我在上面开发过不少swing应用,像游戏的怪物生成器,都不卡。netbeans,我在家里用来开发web也不卡。之前一个公司,用eclipse也用netbeans,没有人说netbeans卡,大家随意选择。
224 楼 leesonhomme 2010-02-26  
支持一下,我目前也是做swing的~ 但就是外表上做得不怎么美观~自己不是很熟悉界面设计这块。

相关推荐

    AWT与Swing使用区别

    - **Swing**:Swing组件是轻量级的,它们不依赖于底层操作系统,而是完全由Java实现。这使得Swing组件具有跨平台的一致性,并且提供了更丰富的功能和自定义选项。 2. **组件的扩展性和可定制性** - **AWT**:AWT...

    swing开发课件,学习GUI的课程

    Swing的一个重要特性是轻量级,这意味着它不依赖于操作系统提供的GUI组件,这使得Swing的应用程序具有更好的跨平台兼容性。 Swing提供了模型-视图-控制器(MVC)架构,使得代码更加结构化和可维护。例如,JTable...

    Swing做的人事管理系统

    Swing是轻量级的,因为它不依赖于操作系统提供的UI组件,这使得Swing应用具有跨平台性。在这个人事管理系统中,Swing被用来设计和实现图形用户界面,包括菜单、对话框、表格和其他交互元素。 2. **SQL Server数据库...

    swing登录注册界面设计

    学习和掌握swing登录注册界面设计,对于开发者来说,不仅是学习Java Swing开发基本技能的过程,也是提升软件开发能力和效率的重要途径。通过构建出既实用又美观的界面,开发者可以为用户提供更优质的体验,从而提升...

    Java+Swing+Mysql实现通讯录管理系统

    总的来说,这个“Java+Swing+Mysql实现通讯录管理系统”是一个集成了Java后端处理、Swing图形界面设计和MySQL数据库管理的实用应用,它展示了如何将这些技术有效地结合在一起,为用户提供一个便捷的通讯录管理工具。...

    Java-推箱子.zip

    注释的存在意味着代码的可读性和可维护性得到了重视,这对于后续的修改和优化至关重要。 总的来说,这个"Java-推箱子"项目涵盖了Java GUI编程、游戏逻辑设计、对象建模和事件驱动编程等多个方面的知识。通过学习和...

    计算器(TCalculator)

    【描述】该计算器应用的设计目的是为用户提供一个方便的计算环境,无论是进行日常计算还是解决复杂的数学问题。用户可以通过图形用户界面(GUI)直观地输入数字和选择运算符。作者鼓励用户如果有任何疑问或建议,...

    最新版Substance5

    Substance 是一个流行的 Java Swing 主题库,它允许开发者为他们的 Java 应用程序提供丰富的、自定义的外观和感觉。这款最新版 Substance 5...对于那些重视用户界面设计的开发者来说,Substance 是一个不可或缺的工具。

    xcode-maven-plugin-1.4.1.zip

    开源项目通常会有活跃的社区支持,为开发者提供了丰富的学习和协作机会。 在压缩包"swing-shortcut-manager-master"中,我们可能找到以下内容: 1. 项目的源代码文件:包括`.java`文件,这些是用Java语言编写的源...

    Java简明教程

     本书不仅注重知识传授,而且重视对读者创新能力的培养。 本书讲述Java面向对象编程的思想和方法,揭示Java的技术实现内幕和编译上的不完善之处,这对培养读者勤于思考、勇于实践和敢十创新很有帮助。在编排上采用...

    基于Android的家教预约平台app,结合Android、java和sql的前端和后端应用开发

    随着时代的快速发展,知识更新越来越快,家长们对自己孩子的教育也越来越重视,不希望自己的孩子输在起跑线上,因此,越来越多的家长不断搜寻好的老师给孩子做课外辅导。然而,据调查发现,现有的辅导教育机构招聘的...

    StudentListApp.rar_管理 applet

    在当今信息技术高速发展的时代,教育领域的信息化管理也日益受到重视。本文将深入探讨一个名为"StudentListApp"的网络版学生成绩管理系统,它采用Java Applet技术进行开发,旨在提供一种高效、便捷的方式来管理学生...

    UML.rar_java酒店预订_site:www.pudn.com_酒店预订

    开发者可能利用Java Swing或JavaFX库来创建图形用户界面(GUI),这两个库提供了丰富的组件和工具,可以轻松构建出复杂且美观的界面。 动态不规则界面是指界面设计不遵循传统的矩形布局,而是采用更自由、更富创意...

    GUI美化

    GUI美化不仅仅是视觉上的提升,更是对用户体验的重视。Java SE提供了丰富的工具和框架,使开发者能够轻松实现这一目标。通过本文的介绍,相信读者已经掌握了Java界面美化的关键技术和实践方法,期待大家能在自己的...

    JavaEye新闻月刊 - 2010年02月 - 总第24期

    5. **Swing Worldclock - 世界时钟效果**:Swing是Java提供的图形用户界面库,这个示例展示了如何使用Swing创建一个世界时钟,展示了Swing的灵活性和可定制性。 6. **开源作业调度框架Quartz 1.7.1发布**:Quartz是...

    Java面试技巧大全

    面试往往重视候选人的基础知识掌握程度,因为这是评估程序员素质的重要标准。以下是一些Java面试中常见的知识点: 1. **final, finally, finalize的区别**: - `final`:用于修饰变量、方法和类,表示变量不可变、...

    Java.Programming.From.Problem.Analysis.to.Program.Design

    总结来说,Java编程语言因其在教育界的普及和作为计算机科学入门编程语言的地位而受到重视。本书《Java编程:从问题分析到程序设计》不仅涵盖了传统和现代编程风格,也为编程初学者提供了一个系统的编程学习框架。...

    java版bad apple

    总的来说,Java版Bad Apple项目展示了Java在图形编程方面的潜力,同时也对开发者提出了挑战,要求他们具备良好的编程技巧、图像处理知识以及对用户体验的重视。这个项目不仅是对经典作品的致敬,也是Java学习者提升...

    JAVA自学之路

    但是如果把时间花在spring的各种细节的研究上,花在研究中国企业应用不广泛地的spring mvc上,这个精力就太浪费了,而且学习的积极性会受到打击,谁愿意整天泡在细节的蜘蛛网中挣扎不出来呢?谁愿意天天经历风雨却...

    课程设计报告-ATM柜员机模拟程序.doc

    在本次面向对象程序设计的课程设计中,我们以ATM柜员机模拟程序为题,旨在深入理解和应用图形用户界面(GUI)设计方法,以及熟练掌握Java Swing组件的使用和事件处理程序的编写。以下是详细的设计报告内容: 1. **...

Global site tag (gtag.js) - Google Analytics