论坛首页 Java企业应用论坛

Swing为什么不受重视

浏览 146484 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-02-24  
老帖了,顺便说下我们公司开发的基于Swing的软件上千万行,已经持续开发了10年了,外企
0 请登录后投票
   发表时间:2010-02-25  
刚开始搞java就是从swing开始的  ,但很久没用了 ,之前给我的感受就是郁闷,真的有点痛苦
0 请登录后投票
   发表时间:2010-02-25  
不知道,但是我觉得在Flash/Silverlight之前,没有火起来,以后就更难了。
0 请登录后投票
   发表时间:2010-02-26  
支持一下,我目前也是做swing的~ 但就是外表上做得不怎么美观~自己不是很熟悉界面设计这块。
0 请登录后投票
   发表时间:2010-03-29  
起初,我用netbeans开发半年j2me,卡是卡,但能接受。后来换一台机子,只因有了独显。现在再也不卡了。swing是需要显卡支持的。我在上面开发过不少swing应用,像游戏的怪物生成器,都不卡。netbeans,我在家里用来开发web也不卡。之前一个公司,用eclipse也用netbeans,没有人说netbeans卡,大家随意选择。
0 请登录后投票
   发表时间:2010-03-29  
以后会用netbeans开发,开发动编,地编(有个叫tiled的开源项目就是居于swing的)等。也可能做桌面游戏吧。桌面游戏的话用的不多,表面上也就JFrame,JTextField,Graphics,JOptionPane,Event吧。游戏里的所用东西用Graphics画,收入框用JTextFiled(因为涉及到收入法).JOptionPane在JFrame点X时,弹出是否退出的confirm。说swing不行的,去网上找找,现在有多少java swing写的游戏了。
0 请登录后投票
   发表时间:2010-03-29   最后修改: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来开发,省许多时间。



0 请登录后投票
   发表时间:2010-03-30  
…………一年前的帖子,你们真能挖。

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

不过swing情节还是有的。毕竟第一个工程就是拿Swing做界面。
0 请登录后投票
   发表时间:2010-03-30  
国外还是比较重视Swing的,很多项目的都是用Swing在做,用Jbuilder和NetBeans生成的界面,代码部分很难阅读,但是手写布局效率又很低,我感觉只要解决这个问题,Swing还是很有前途的,我曾经做过国外的一个项目就是用Swing+XML布局完成的,客户要求不能用可视化工具编写GUI,只能手写,运算速度也不慢,但就是开发效率太低了,50%的缺陷都是跟界面布局有关的,Swing用的好,做出来的效果相当漂亮。
0 请登录后投票
   发表时间:2010-03-30   最后修改: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"));是自己加上过滤器上去的,虽然不可以直接在上面自动生成的代码改,可是却可以自己订制代码的。
代码太多了,不知道能不能发出去。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics