工作以來,一直都是基於java web方向的開發,並沒有java方向GUI相關的開發經驗,不過好在之前用過winform開發。有了基礎的套路,想來搞一下Swing也沒有什麼壓力!到網上搜了一下相關的學習資料,有拖拖拽拽的控件,也有代碼實現的。為了加深印象和理解,直接搞代碼吧~
參考了網上的相關博客,先有一個大體的了解,比如:http://www.blogjava.net/jerry-zhaoj/articles/283170.html
選擇了一個PDF作為學習的參考:Java Swing圖形界面開發與案例詳解 .王鵬等.掃描版.pdf
學習Swing之前,先來了解一下AWT:
AWT(Abstract Windows Toolkit):抽象窗口工具集,提供了與本地圖形化界面交互的接口,底層調用本地操作系統。由於實現依賴於本地操作系統,所以是重量級組件,Swing則是在實現AWT的基礎上做擴展的,組件是以純java的方式來實現的,不依賴於底層的操作系統,所以是輕量級組件。AWT設計的初衷是開發小的應用程序的圖形界面,而非專門用於用戶界面(UI)的工具包而設計,所以做UI有些欠缺,比如剪切板、彈出菜單、滾動等功能都不支持。
接著照著第一章的例子做了3個demo,demo中不用關心具體的代碼細節,先看大體的框架即可。
demo1:登錄窗口
demo2:菜單欄、工具欄
demo3:tab頁簽
demo1:
package com.comall.fastsvn.test.chapter1;
import javax.swing.*;
import java.awt.*;
/**
* 登錄界面
*/
public class SwingDemo1 extends JPanel {
private static final int JFRAME_WIDTH = 300;
private static final int JFRAME_HEIGHT= 150;
private SwingDemo1(){
//窗口-頂層面板
JFrame jFrame = new JFrame("登錄窗口");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//網格布局,容器中的方法
GridBagLayout gridBagLayout = new GridBagLayout();
setLayout(gridBagLayout);
jFrame.add(this,BorderLayout.WEST);
jFrame.setSize(JFRAME_WIDTH,JFRAME_HEIGHT);
//位置:居中
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
jFrame.setLocation((int)(dimension.getWidth() - JFRAME_WIDTH ) / 2,(int)(dimension.getHeight() - JFRAME_HEIGHT ) / 2);
//組件
JLabel tipLabel = new JLabel("歡迎來到Java世界");
JLabel userLabel = new JLabel("用戶名:");
JLabel pwdLabel = new JLabel("密碼:");
JTextField userText = new JTextField(15);
JTextField pwdText = new JTextField(15);
JButton submitBtn = new JButton("登錄");
JButton cancelBtn = new JButton("取消");
//網格布局
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.NONE;
gridBagConstraints.anchor = GridBagConstraints.EAST;
gridBagConstraints.weightx = 3;
gridBagConstraints.weighty = 4;
//添加組件並指定組件的位置
addComponent(tipLabel,gridBagConstraints,0,0,4,1);
addComponent(userLabel,gridBagConstraints,0,1,1,1);
addComponent(pwdLabel,gridBagConstraints,0,2,1,1);
addComponent(userText,gridBagConstraints,2,1,1,1);
addComponent(pwdText,gridBagConstraints,2,2,1,1);
addComponent(submitBtn,gridBagConstraints,0,3,1,1);
addComponent(cancelBtn,gridBagConstraints,2,3,1,1);
//面板可見、不可編輯
jFrame.setResizable(false);
jFrame.setVisible(true);
}
/**
* 添加組件
* @param component 組件
* @param gridBagConstraints
* @param x 行
* @param y 列
* @param w 寬
* @param h 高
*/
private void addComponent(Component component,GridBagConstraints gridBagConstraints,int x,int y,int w,int h){
gridBagConstraints.gridx = x;
gridBagConstraints.gridy = y;
gridBagConstraints.gridwidth = w;
gridBagConstraints.gridheight = h;
//Container中的方法
add(component,gridBagConstraints);
}
public static void main(String[] args) {
new SwingDemo1();
}
}
運行效果:

demo2:
package com.comall.fastsvn.test.chapter1;
import javax.swing.*;
import java.awt.*;
/**
* 菜單欄、工具欄
*/
public class SwingDemo2 {
private static final int JFRAME_WIDTH = 600;
private static final int JFRAME_HEIGHT= 400;
public SwingDemo2(){
//窗口-頂層面板
JFrame jFrame = new JFrame("菜單工具欄");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(JFRAME_WIDTH,JFRAME_HEIGHT);
//窗口內加入面板
JPanel jPanel = new JPanel();
jFrame.setContentPane(jPanel);
//窗口加入菜單欄
JMenuBar menuBar = new JMenuBar();
jFrame.setJMenuBar(menuBar);
//菜單欄加菜單
JMenu menu1 = new JMenu("菜單1");
JMenu menu2 = new JMenu("菜單2");
menuBar.add(menu1);menuBar.add(menu2);
//菜單加子菜單
JMenuItem menuItem11 = new JMenuItem("子菜單11");
JMenuItem menuItem12 = new JMenuItem("子菜單12");
JMenuItem menuItem21 = new JMenuItem("子菜單21");
JMenuItem menuItem22 = new JMenuItem("子菜單22");
menu1.add(menuItem11);
menu1.addSeparator();
menu1.add(menuItem12);
menu2.add(menuItem21);
menu2.addSeparator();
menu2.add(menuItem22);
//面板加入工具欄
JButton jButton1 = new JButton("工具1");
JButton jButton2 = new JButton("工具2");
JButton jButton3 = new JButton("工具3");
JToolBar toolBar = new JToolBar();
toolBar.add(jButton1);
toolBar.add(jButton2);
toolBar.add(jButton3);
//布局
BorderLayout borderLayout = new BorderLayout();
jPanel.setLayout(borderLayout);
jPanel.add("North",toolBar);
//位置:居中
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
jFrame.setLocation((int)(dimension.getWidth() - JFRAME_WIDTH ) / 2,(int)(dimension.getHeight() - JFRAME_HEIGHT ) / 2);
//面板可見、不可編輯
jFrame.setResizable(false);
jFrame.setVisible(true);
}
public static void main(String[] args) {
new SwingDemo2();
}
}
運行效果:

demo3:
package com.comall.fastsvn.test.chapter1;
import javax.swing.*;
import java.awt.*;
/**
*
*/
public class SwingDemo3 extends JTabbedPane{
private static final int JFRAME_WIDTH = 600;
private static final int JFRAME_HEIGHT= 400;
private SwingDemo3(){
//窗口-頂層面板
JFrame jFrame = new JFrame("tab頁簽");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(JFRAME_WIDTH,JFRAME_HEIGHT);
jFrame.setVisible(true);
//面板
JPanel jPanel = new JPanel();
jFrame.setContentPane(jPanel);
setLayout(new BorderLayout());
//子面板
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
jPanel1.setLayout(new BorderLayout());
addTab("panel1",jPanel1);
setEnabledAt(0,true);
setTitleAt(0,"測試頁1");
addTab("panel2",jPanel2);
setEnabledAt(1,true);
setTitleAt(1,"測試頁2");
setPreferredSize(new Dimension(500,200));
setTabPlacement(JTabbedPane.TOP);
setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
jPanel.add("Center",this);
setVisible(true);
}
public static void main(String[] args) {
new SwingDemo3();
}
}
運行效果:
