锁定老帖子 主题:Swing为什么不受重视
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-24
老帖了,顺便说下我们公司开发的基于Swing的软件上千万行,已经持续开发了10年了,外企
|
|
返回顶楼 | |
发表时间:2010-02-25
刚开始搞java就是从swing开始的 ,但很久没用了 ,之前给我的感受就是郁闷,真的有点痛苦
|
|
返回顶楼 | |
发表时间:2010-02-25
不知道,但是我觉得在Flash/Silverlight之前,没有火起来,以后就更难了。
|
|
返回顶楼 | |
发表时间:2010-02-26
支持一下,我目前也是做swing的~ 但就是外表上做得不怎么美观~自己不是很熟悉界面设计这块。
|
|
返回顶楼 | |
发表时间:2010-03-29
起初,我用netbeans开发半年j2me,卡是卡,但能接受。后来换一台机子,只因有了独显。现在再也不卡了。swing是需要显卡支持的。我在上面开发过不少swing应用,像游戏的怪物生成器,都不卡。netbeans,我在家里用来开发web也不卡。之前一个公司,用eclipse也用netbeans,没有人说netbeans卡,大家随意选择。
|
|
返回顶楼 | |
发表时间:2010-03-29
以后会用netbeans开发,开发动编,地编(有个叫tiled的开源项目就是居于swing的)等。也可能做桌面游戏吧。桌面游戏的话用的不多,表面上也就JFrame,JTextField,Graphics,JOptionPane,Event吧。游戏里的所用东西用Graphics画,收入框用JTextFiled(因为涉及到收入法).JOptionPane在JFrame点X时,弹出是否退出的confirm。说swing不行的,去网上找找,现在有多少java swing写的游戏了。
|
|
返回顶楼 | |
发表时间: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来开发,省许多时间。 |
|
返回顶楼 | |
发表时间:2010-03-30
…………一年前的帖子,你们真能挖。
前两天用WPF做了一下那些水晶按钮。 比起用Swing做出好看的界面让人激动的感觉来说, WPF真的不让我激动,好像是必须的。 不过swing情节还是有的。毕竟第一个工程就是拿Swing做界面。 |
|
返回顶楼 | |
发表时间:2010-03-30
国外还是比较重视Swing的,很多项目的都是用Swing在做,用Jbuilder和NetBeans生成的界面,代码部分很难阅读,但是手写布局效率又很低,我感觉只要解决这个问题,Swing还是很有前途的,我曾经做过国外的一个项目就是用Swing+XML布局完成的,客户要求不能用可视化工具编写GUI,只能手写,运算速度也不慢,但就是开发效率太低了,50%的缺陷都是跟界面布局有关的,Swing用的好,做出来的效果相当漂亮。
|
|
返回顶楼 | |
发表时间: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"));是自己加上过滤器上去的,虽然不可以直接在上面自动生成的代码改,可是却可以自己订制代码的。 代码太多了,不知道能不能发出去。。 |
|
返回顶楼 | |