`
EdwardWorld
  • 浏览: 28627 次
  • 性别: 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 Swing的saberlily游戏系统设计源码

    本项目是一个基于Java Swing的综合性游戏开发实例,名为“saberlily游戏系统”。Java Swing是Java平台的一个用户界面工具包,广泛应用于编写跨平台的桌面应用程序。saberlily游戏系统将Java Swing的界面开发能力与...

    使用Java Swing窗口来实现《单词记忆游戏 CS 版》可以提供一个更直观和用户友好的界面 包括显示单词、隐藏单词以及接收用户输入的文本框

    在实现《单词记忆游戏CS版》这一特定场景中,Java Swing发挥了其图形用户界面的优势,为用户提供了更为直观和用户友好的操作体验。 《单词记忆游戏CS版》是一款以记忆单词为基础的教育类游戏,其目的是帮助用户更好...

    基于java Swing+面向对象实现的班级管理系统(源码+课程设计报告文档)

    基于Java Swing和面向对象实现的班级管理系统,不仅展示了一个实用软件的开发过程,还体现了软件工程中对于用户界面设计、编程方法学以及项目文档编写的重视。通过该项目,学习者可以更全面地掌握软件开发的各个方面...

    基于Java中的swing类的图形化飞机游戏的开发练习.zip

    此外,游戏界面的美观性也是需要重视的一个方面。Swing允许使用各种布局管理器来组织界面中的组件,如FlowLayout、BorderLayout、GridLayout等。开发者可能会使用JLabel来显示分数和生命值,使用JButton来实现开始...

    毕设-java-swing-仓库商品管理系统(文档+视频+源码)

    在当今快速发展的信息技术时代,软件开发已成为一个极为重要的领域,其中仓库商品管理系统作为企业日常运营中不可或缺的一部分,其开发过程及应用也受到了广泛的重视。近年来,随着Java编程语言和Swing图形用户界面...

    java swing版贪吃蛇小游戏,来自尚学堂视频教程课件

    Java Swing是Java的一部分,它为开发者提供了一套丰富的GUI组件,使他们可以轻松构建跨平台的桌面应用程序。在开发贪吃蛇游戏的过程中,Swing提供了一系列的组件和功能,比如定时器(用于控制游戏的刷新率)、画布...

    Java-推箱子.zip

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

    Java语言实例-毕业设计项目:飞机订票系统(基于Swing与数据库的GUI应用)-开题报告,论文,答辩PPT参考

    该项目基于Java Swing框架进行图形用户界面设计,结合MySQL或Oracle数据库技术,为用户提供了一个完整的订票流程体验,包括用户注册、登录、航班查询、票务预订、改签以及退票等核心功能。 首先,Java Swing作为...

    毕设-java-swing-酒店管理系统(ppt+ER图+流程图+需求背景数据库+架构说明有lun文视频源码齐全)3.zip

    随着信息技术的快速发展,计算机软件开发已成为现代信息技术教育中的重要组成部分,尤其在高校的毕业设计环节中,软件项目的设计与开发越来越受到重视。在这样的背景下,一款功能全面、操作简便的酒店管理系统显得尤...

    计算器(TCalculator)

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

    Java 飞机订票系统实训报告

    系统实现阶段是将设计转化为实际的程序代码,这一阶段涉及到前端的Swing界面实现和后端数据库的操作。通过JDBC连接技术,系统能够完成对数据库的CRUD(创建、读取、更新、删除)操作。同时,系统还需要经过详细的...

    最新版Substance5

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

    xcode-maven-plugin-1.4.1.zip

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

    飘逸-若依前后端分离版包名修改器

    Java Swing作为Java平台的标准GUI工具包,为开发者提供了一个构建图形用户界面的快速方式。SpringBoot则大大简化了基于Spring的应用开发过程,通过约定优于配置的方式,减少了项目设置的复杂度。FlatLaf提供了一种...

    Java简明教程

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

Global site tag (gtag.js) - Google Analytics