Swing 是一个为Java设计的GUI工具包。
Swing是JAVA基础类的一部分。
Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。
Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
Swing的优点:
1:性能不错,因为其底子Java2D还不错,不是极其特别海量级应用基本都可胜任
2:bug并不是想象那么多,这些年sun已修复很多,即使有也很容易到找workaround
3:组件市场谈不上丰富,但该有的也都有了jidesoft,infonode,jfreechart,swinglabs等可以参考
4:大型的应用问题不在于Swing,选用任何其他GUI也都得考虑分业务,分模块加载等问题,这方面NetBeansRCP和EclipseRCP都可以参考,我建议先不考虑引入RCP增加学习指数(包括引入更多风险),如果实在必要需用NetBeansRCP比较舒服,Eclipse的RCP需要考虑Swing和SWT的整合有不少问题恭候着你
Swing的缺点:
1:其MVC的设计框架还是很稳健,使的Swing这么十几年屹立不倒,不过还是显示出了老态和缺陷,这个话题很大可以写好几篇文章,简单说Swing的设计不如Flex的MVP,不如Silverlight/WPF的MVVM易于让程序员编写,测试包括IDE的提供
2:Swing的lookandfeel是很好的思想,但没有设计好,这么多年虽然也有不好官方,开源和商业的LAF出现,但除了官方常用的那几个虽然丑但没有太多bug还算能用,其他我基本不用除非应用不复杂
3:Swing有很多layout初衷很好,但同样问题是众多实现者中没有几款简单易用的,我自己写了个布局这些年我自己一直用自己的这个布局,公司很多其他人也是熟悉哪款可能一辈子就用它了,因为没时间去折腾研究其他款
4:组件的确不是相当丰富完善,一个DateChooser到现在都没个官方的,JDK7只是maybe,确定的是在JDK8提供,当然这不严重前面提到你可以很容易找到其他开源或商业的组件解决,不过也能反映点问题
最后谈点个人经验,我们公司是重度Swing使用者,都是手工写界面代码,如果大型项目自然值得好好投入去积累组件和封装,有了好的封装的组件基本手工代码还是非常简单易读方便维护,另外就像第一点提到Java2D真的不错,如果你觉得那些地方实在太难用了,实在太差丑了,或者实在性能太差了,你完全可以随便扩展个component自己去paint完全用Java2D重新个你满意的组件,有点经验后你会发现写个组件不是那么难,而且还挺有趣。
1:性能不错,因为其底子Java2D还不错,不是极其特别海量级应用基本都可胜任
2:bug并不是想象那么多,这些年sun已修复很多,即使有也很容易到找workaround
3:组件市场谈不上丰富,但该有的也都有了jidesoft,infonode,jfreechart,swinglabs等可以参考
4:大型的应用问题不在于Swing,选用任何其他GUI也都得考虑分业务,分模块加载等问题,这方面NetBeansRCP和EclipseRCP都可以参考,我建议先不考虑引入RCP增加学习指数(包括引入更多风险),如果实在必要需用NetBeansRCP比较舒服,Eclipse的RCP需要考虑Swing和SWT的整合有不少问题恭候着你
Swing的缺点:
1:其MVC的设计框架还是很稳健,使的Swing这么十几年屹立不倒,不过还是显示出了老态和缺陷,这个话题很大可以写好几篇文章,简单说Swing的设计不如Flex的MVP,不如Silverlight/WPF的MVVM易于让程序员编写,测试包括IDE的提供
2:Swing的lookandfeel是很好的思想,但没有设计好,这么多年虽然也有不好官方,开源和商业的LAF出现,但除了官方常用的那几个虽然丑但没有太多bug还算能用,其他我基本不用除非应用不复杂
3:Swing有很多layout初衷很好,但同样问题是众多实现者中没有几款简单易用的,我自己写了个布局这些年我自己一直用自己的这个布局,公司很多其他人也是熟悉哪款可能一辈子就用它了,因为没时间去折腾研究其他款
4:组件的确不是相当丰富完善,一个DateChooser到现在都没个官方的,JDK7只是maybe,确定的是在JDK8提供,当然这不严重前面提到你可以很容易找到其他开源或商业的组件解决,不过也能反映点问题
最后谈点个人经验,我们公司是重度Swing使用者,都是手工写界面代码,如果大型项目自然值得好好投入去积累组件和封装,有了好的封装的组件基本手工代码还是非常简单易读方便维护,另外就像第一点提到Java2D真的不错,如果你觉得那些地方实在太难用了,实在太差丑了,或者实在性能太差了,你完全可以随便扩展个component自己去paint完全用Java2D重新个你满意的组件,有点经验后你会发现写个组件不是那么难,而且还挺有趣。
举个例子:
package
hello
;
import javax . swing . * ;
import javax . swing . event . * ;
import java . awt . event . * ;
import java . awt . * ;
/**
* swing基础实例
* @author HZ20232
*
*/
public class Hello {
public static void main ( String args [ ] ) throws Exception {
NewFrame frame1 = new NewFrame ( ) ;
frame1 . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ; //一定要设置关闭
frame1 . setVisible ( true ) ;
}
}
class NewFrame extends JFrame {
private JLabel label1 ;
private JButton button1 ;
private JTextField text1 ;
private JComboBox box ;
private JMenuBar menuBar ;
private JSlider slider ;
private JSpinner spinner ;
private JToolBar toolBar ;
public NewFrame ( ) {
super ( ) ;
this . setSize ( 300 , 500 ) ;
this . getContentPane ( ) . setLayout ( null ) ; //设置布局控制器
// this.getContentPane().setLayout(new FlowLayout());//设置布局控制器
// this.getContentPane().setLayout(new GridLayout(1,2));//设置布局控制器,需要给出设定的行列数目
// this.getContentPane().setLayout(new BorderLayout());//设置布局控制器,以North,South,West,East,来控制控件布局
// this.getContentPane().setLayout(new GridBagLayout());//设置布局控制器
this . add ( this . getTextField ( ) , null ) ; //添加文本框
this . add ( this . getButton ( ) , null ) ; //添加按钮
this . add ( this . getLabel ( ) , null ) ; //添加标签
this . add ( this . getBox ( ) , null ) ; //添加下拉列表框
this . setJMenuBar ( this . getMenu ( ) ) ; //添加菜单
this . add ( this . getSlider ( ) , null ) ;
this . add ( this . getSpinner ( ) , null ) ;
this . add ( this . getToolBar ( ) , null ) ;
this . setTitle ( "Hello World!" ) ; //设置窗口标题
}
private JToolBar getToolBar ( ) {
if ( toolBar = = null ) {
toolBar = new JToolBar ( ) ;
toolBar . setBounds ( 103 , 260 , 71 , 20 ) ;
toolBar . setFloatable ( true ) ;
}
return toolBar ;
}
private JSpinner getSpinner ( ) {
if ( spinner = = null ) {
spinner = new JSpinner ( ) ;
spinner . setBounds ( 103 , 220 , 80 , 20 ) ;
spinner . setValue ( 100 ) ;
}
return spinner ;
}
private JSlider getSlider ( ) {
if ( slider = = null ) {
slider = new JSlider ( ) ;
slider . setBounds ( 103 , 200 , 100 , 20 ) ;
slider . setMaximum ( 100 ) ;
slider . setMinimum ( 0 ) ;
slider . setOrientation ( 0 ) ;
slider . setValue ( 0 ) ;
}
return slider ;
}
/**
* 菜单的级别JMenuBar->JMenu->JMenuItem
* 三级都是1:n的关系
* 最后添加菜单用的SetJMenuBar方法
* @return 建立好的菜单
*/
private JMenuBar getMenu ( ) {
if ( menuBar = = null ) {
menuBar = new JMenuBar ( ) ;
JMenu m1 = new JMenu ( ) ;
m1 . setText ( "文件" ) ;
JMenu m2 = new JMenu ( ) ;
m2 . setText ( "编辑" ) ;
JMenu m3 = new JMenu ( ) ;
m3 . setText ( "帮助" ) ;
JMenuItem item11 = new JMenuItem ( ) ;
item11 . setText ( "打开" ) ;
JMenuItem item12 = new JMenuItem ( ) ;
item12 . setText ( "保存" ) ;
JMenuItem item13 = new JMenuItem ( ) ;
item13 . setText ( "退出" ) ;
JMenuItem item21 = new JMenuItem ( ) ;
item21 . setText ( "复制" ) ;
JMenuItem item22 = new JMenuItem ( ) ;
item22 . setText ( "拷贝" ) ;
JMenuItem item23 = new JMenuItem ( ) ;
item23 . setText ( "剪切" ) ;
JMenuItem item31 = new JMenuItem ( ) ;
item31 . setText ( "欢迎" ) ;
JMenuItem item32 = new JMenuItem ( ) ;
item32 . setText ( "搜索" ) ;
JMenuItem item33 = new JMenuItem ( ) ;
item33 . setText ( "版本信息" ) ;
m1 . add ( item11 ) ;
m1 . add ( item12 ) ;
m1 . add ( item13 ) ;
m2 . add ( item21 ) ;
m2 . add ( item22 ) ;
m2 . add ( item23 ) ;
m3 . add ( item31 ) ;
m3 . add ( item32 ) ;
m3 . add ( item33 ) ;
menuBar . add ( m1 ) ;
menuBar . add ( m2 ) ;
menuBar . add ( m3 ) ;
}
return menuBar ;
}
/**
* 设置下拉列表框
* @return
*/
private JComboBox getBox ( ) {
if ( box = = null ) {
box = new JComboBox ( ) ;
box . setBounds ( 103 , 140 , 71 , 27 ) ;
box . addItem ( "1" ) ;
box . addItem ( "2" ) ;
box . addActionListener ( new comboxListener ( ) ) ; //为下拉列表框添加监听器类
}
return box ;
}
private class comboxListener implements ActionListener {
public void actionPerformed ( ActionEvent e ) {
Object o = e . getSource ( ) ;
System . out . println ( o . toString ( ) ) ;
}
}
/**
* 设置标签
* @return 设置好的标签
*/
private JLabel getLabel ( ) {
if ( label1 = = null ) {
label1 = new JLabel ( ) ;
label1 . setBounds ( 34 , 49 , 53 , 18 ) ;
label1 . setText ( "Name" ) ;
label1 . setToolTipText ( "JLabel" ) ;
}
return label1 ;
}
/**
* 设置按钮
* @return 设置好的按钮
*/
private JButton getButton ( ) {
if ( button1 = = null ) {
button1 = new JButton ( ) ;
button1 . setBounds ( 103 , 110 , 71 , 27 ) ;
button1 . setText ( "OK" ) ;
button1 . setToolTipText ( "OK" ) ;
button1 . addActionListener ( new HelloButton ( ) ) ; //添加监听器类,其主要的响应都由监听器类的方法实现
}
return button1 ;
}
/**
* 监听器类实现ActionListener接口,主要实现actionPerformed方法
* @author HZ20232
*
*/
private class HelloButton implements ActionListener {
public void actionPerformed ( ActionEvent e ) {
System . out . println ( "Hello world!" ) ;
}
}
/**
* 设定文本域
* @return
*/
private JTextField getTextField ( ) {
if ( text1 = = null ) {
text1 = new JTextField ( ) ;
text1 . setBounds ( 96 , 49 , 160 , 20 ) ;
}
return text1 ;
}
}
import javax . swing . * ;
import javax . swing . event . * ;
import java . awt . event . * ;
import java . awt . * ;
/**
* swing基础实例
* @author HZ20232
*
*/
public class Hello {
public static void main ( String args [ ] ) throws Exception {
NewFrame frame1 = new NewFrame ( ) ;
frame1 . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ; //一定要设置关闭
frame1 . setVisible ( true ) ;
}
}
class NewFrame extends JFrame {
private JLabel label1 ;
private JButton button1 ;
private JTextField text1 ;
private JComboBox box ;
private JMenuBar menuBar ;
private JSlider slider ;
private JSpinner spinner ;
private JToolBar toolBar ;
public NewFrame ( ) {
super ( ) ;
this . setSize ( 300 , 500 ) ;
this . getContentPane ( ) . setLayout ( null ) ; //设置布局控制器
// this.getContentPane().setLayout(new FlowLayout());//设置布局控制器
// this.getContentPane().setLayout(new GridLayout(1,2));//设置布局控制器,需要给出设定的行列数目
// this.getContentPane().setLayout(new BorderLayout());//设置布局控制器,以North,South,West,East,来控制控件布局
// this.getContentPane().setLayout(new GridBagLayout());//设置布局控制器
this . add ( this . getTextField ( ) , null ) ; //添加文本框
this . add ( this . getButton ( ) , null ) ; //添加按钮
this . add ( this . getLabel ( ) , null ) ; //添加标签
this . add ( this . getBox ( ) , null ) ; //添加下拉列表框
this . setJMenuBar ( this . getMenu ( ) ) ; //添加菜单
this . add ( this . getSlider ( ) , null ) ;
this . add ( this . getSpinner ( ) , null ) ;
this . add ( this . getToolBar ( ) , null ) ;
this . setTitle ( "Hello World!" ) ; //设置窗口标题
}
private JToolBar getToolBar ( ) {
if ( toolBar = = null ) {
toolBar = new JToolBar ( ) ;
toolBar . setBounds ( 103 , 260 , 71 , 20 ) ;
toolBar . setFloatable ( true ) ;
}
return toolBar ;
}
private JSpinner getSpinner ( ) {
if ( spinner = = null ) {
spinner = new JSpinner ( ) ;
spinner . setBounds ( 103 , 220 , 80 , 20 ) ;
spinner . setValue ( 100 ) ;
}
return spinner ;
}
private JSlider getSlider ( ) {
if ( slider = = null ) {
slider = new JSlider ( ) ;
slider . setBounds ( 103 , 200 , 100 , 20 ) ;
slider . setMaximum ( 100 ) ;
slider . setMinimum ( 0 ) ;
slider . setOrientation ( 0 ) ;
slider . setValue ( 0 ) ;
}
return slider ;
}
/**
* 菜单的级别JMenuBar->JMenu->JMenuItem
* 三级都是1:n的关系
* 最后添加菜单用的SetJMenuBar方法
* @return 建立好的菜单
*/
private JMenuBar getMenu ( ) {
if ( menuBar = = null ) {
menuBar = new JMenuBar ( ) ;
JMenu m1 = new JMenu ( ) ;
m1 . setText ( "文件" ) ;
JMenu m2 = new JMenu ( ) ;
m2 . setText ( "编辑" ) ;
JMenu m3 = new JMenu ( ) ;
m3 . setText ( "帮助" ) ;
JMenuItem item11 = new JMenuItem ( ) ;
item11 . setText ( "打开" ) ;
JMenuItem item12 = new JMenuItem ( ) ;
item12 . setText ( "保存" ) ;
JMenuItem item13 = new JMenuItem ( ) ;
item13 . setText ( "退出" ) ;
JMenuItem item21 = new JMenuItem ( ) ;
item21 . setText ( "复制" ) ;
JMenuItem item22 = new JMenuItem ( ) ;
item22 . setText ( "拷贝" ) ;
JMenuItem item23 = new JMenuItem ( ) ;
item23 . setText ( "剪切" ) ;
JMenuItem item31 = new JMenuItem ( ) ;
item31 . setText ( "欢迎" ) ;
JMenuItem item32 = new JMenuItem ( ) ;
item32 . setText ( "搜索" ) ;
JMenuItem item33 = new JMenuItem ( ) ;
item33 . setText ( "版本信息" ) ;
m1 . add ( item11 ) ;
m1 . add ( item12 ) ;
m1 . add ( item13 ) ;
m2 . add ( item21 ) ;
m2 . add ( item22 ) ;
m2 . add ( item23 ) ;
m3 . add ( item31 ) ;
m3 . add ( item32 ) ;
m3 . add ( item33 ) ;
menuBar . add ( m1 ) ;
menuBar . add ( m2 ) ;
menuBar . add ( m3 ) ;
}
return menuBar ;
}
/**
* 设置下拉列表框
* @return
*/
private JComboBox getBox ( ) {
if ( box = = null ) {
box = new JComboBox ( ) ;
box . setBounds ( 103 , 140 , 71 , 27 ) ;
box . addItem ( "1" ) ;
box . addItem ( "2" ) ;
box . addActionListener ( new comboxListener ( ) ) ; //为下拉列表框添加监听器类
}
return box ;
}
private class comboxListener implements ActionListener {
public void actionPerformed ( ActionEvent e ) {
Object o = e . getSource ( ) ;
System . out . println ( o . toString ( ) ) ;
}
}
/**
* 设置标签
* @return 设置好的标签
*/
private JLabel getLabel ( ) {
if ( label1 = = null ) {
label1 = new JLabel ( ) ;
label1 . setBounds ( 34 , 49 , 53 , 18 ) ;
label1 . setText ( "Name" ) ;
label1 . setToolTipText ( "JLabel" ) ;
}
return label1 ;
}
/**
* 设置按钮
* @return 设置好的按钮
*/
private JButton getButton ( ) {
if ( button1 = = null ) {
button1 = new JButton ( ) ;
button1 . setBounds ( 103 , 110 , 71 , 27 ) ;
button1 . setText ( "OK" ) ;
button1 . setToolTipText ( "OK" ) ;
button1 . addActionListener ( new HelloButton ( ) ) ; //添加监听器类,其主要的响应都由监听器类的方法实现
}
return button1 ;
}
/**
* 监听器类实现ActionListener接口,主要实现actionPerformed方法
* @author HZ20232
*
*/
private class HelloButton implements ActionListener {
public void actionPerformed ( ActionEvent e ) {
System . out . println ( "Hello world!" ) ;
}
}
/**
* 设定文本域
* @return
*/
private JTextField getTextField ( ) {
if ( text1 = = null ) {
text1 = new JTextField ( ) ;
text1 . setBounds ( 96 , 49 , 160 , 20 ) ;
}
return text1 ;
}
}