工作以來,一直都是基於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(); } }
運行效果: