Swing介紹:
使用Swing開發圖形界面比AWT更加優秀,因為Swing是一種輕量級組件,它采用100% Java實現,不再依賴於本地平台的圖形界面,所以可以在所有平台上保持相同的運行效果,對跨平台支持比較出色,實現了真正的一次編寫處處運行。
除此之外,Swing提供了比AWT更多的圖形界面組件,因此可以開發出更美觀的圖形界面。
Swing組件的基本使用
大部分Swing組件都是JComponent抽象類的直接或間接子類,JComponent類定義了所有子類組件的通用方法。JComponent類是AWT中java.awt.Container類的子類,這也是AWT和Swing的聯系之一。絕大部分Swing組件類繼承了Container類,所以Swing組件都可作為容器使用。
Swing的繼承關系結構如下:

上面的深色部分都是可以在AWT找到對應組件的。比如我們的JButton就和我們Awt中的Button很相似。這些和Awt有關聯的組件就是在原來Awt組件的名字前面加了一個J。但是還是有幾個例外:
- JComboBox: 對應AWT里的Choice組件,但比Choice組件功能更豐富
- JFileChooser: 應於AWT里的FileDialog組件
- JScrollBar: 對應於AWT里的Scrollbar組件,注意兩個組件類名中 字母的大小寫差別。
- JCheckBox 對應於AWT里的checkbox組件,注意兩個組件類名中 字母的大小寫差
- JCheckBoxMenuitem: 對應於AWT里的CheckboxMenuItem 組件,注意兩個組件類名中字母的大小寫差別。
在AWT中的東西,除了Canvas之外,別的所有的Awt組件都提供了相應的實現,Swing組件比AWT組件的功能更加強大。相對於AWT組件,Swing組件具有如下4個額外功能。
- (1),可以為Swing組件設置提示信息。用setToolTipText()方法。
- (2),很多Swing組件,比如我們的按鈕,標簽,菜單項等,除了使用文字之外,還可以用圖標來修飾自己。Swing為Icon接口提供了一個實現類:ImageIcon
- (3),支持插拔式的外觀風格。
- (4),支持設置邊框
示例程序截圖:
示例代碼:
package swingtest; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; /** * @ClassName SwingComponent * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/5/8. */ public class SwingComponent { public static void main(String[] args) { JFrame jFrame = new JFrame("Swing基本組件"); //菜單欄 JMenuBar jMenuBar = new JMenuBar(); //菜單項 JMenu fileMenu = new JMenu("文件"); JMenu editMenu = new JMenu("編輯"); //菜單子項 JMenuItem newMenuItem = new JMenuItem("新建",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem saveMenuItem = new JMenuItem("保存",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem exitMenuItem = new JMenuItem("退出",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); fileMenu.add(newMenuItem); fileMenu.add(saveMenuItem); fileMenu.add(exitMenuItem); //編輯菜單子項 //菜單子項 JMenuItem autoLenMenuItem = new JMenuItem("自動換行",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem copyMenuItem = new JMenuItem("復制",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem pasteMenuItem = new JMenuItem("粘貼",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem noteMenuItem = new JMenuItem("注釋",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem cancleNoteMenuItem = new JMenuItem("取消注釋",new ImageIcon("圖形化編程/src/swingtest/ico/new.png")); JMenuItem formatJMenuItem = new JMenu("格式"); formatJMenuItem.add(noteMenuItem); formatJMenuItem.add(cancleNoteMenuItem); editMenu.add(autoLenMenuItem); editMenu.addSeparator();//換行符 editMenu.add(copyMenuItem); editMenu.add(pasteMenuItem); editMenu.addSeparator();//換行符 editMenu.add(formatJMenuItem); //菜單欄添加菜單 jMenuBar.add(fileMenu); jMenuBar.add(editMenu); jFrame.setJMenuBar(jMenuBar); //底部菜單 JPanel bottomPanel = new JPanel(); bottomPanel.add(new JTextField(30)); bottomPanel.add(new JButton("確定")); jFrame.add(bottomPanel,BorderLayout.SOUTH); /** * 中間部分 */ Box centerBox = Box.createHorizontalBox(); //水平盒子 /** * 中間左 */ Box centerLeftBox = Box.createVerticalBox(); //垂直盒子 /** * 中間左上 */ JTextArea jTextArea = new JTextArea(8, 40); //文本框 //帶滾動條的容器,創建時傳入一個文本框 JScrollPane jScrollPane = new JScrollPane(jTextArea); centerLeftBox.add(jScrollPane); //中間左邊的垂直盒子添加 帶滾動條的容器 /** * 中間左下 */ JPanel leftBottomPanel = new JPanel(); //復選框 leftBottomPanel.add(new JComboBox<String>(new String[]{"紅色","綠色", "藍色"})); //復選框 //單選框、 JRadioButton male = new JRadioButton("男",true); JRadioButton female = new JRadioButton("女"); ButtonGroup sexGroup = new ButtonGroup(); sexGroup.add(male); //單選組添加選項 sexGroup.add(female); //單選組添加選項 leftBottomPanel.add(male);leftBottomPanel.add(female); //左下容器添加選項 //勾選框 leftBottomPanel.add(new JCheckBox("婚否")); //中間左添加中間左下 centerLeftBox.add(leftBottomPanel); /** * 中間右 */ Box centerRightBox = Box.createVerticalBox(); //后邊的垂直盒子 centerRightBox.add(new JList<String>(new String[]{"紅色", "粉色","黃色"})); /** * 水平容器添加左邊盒子,窗口添加水平容器 */ centerBox.add(centerLeftBox);// 水平盒子添加左邊的盒子 centerBox.add(centerRightBox);// 水平盒子添加右邊的盒子 jFrame.add(centerBox); // 窗口添加水平盒子 /** * 右鍵菜單 */ JPopupMenu popupMenu = new JPopupMenu(); //右鍵單選框菜單項 JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem("Metal風格", true); JRadioButtonMenuItem nimbusItem = new JRadioButtonMenuItem("Nimbus風格"); JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem("Windows風格"); JRadioButtonMenuItem classicItem = new JRadioButtonMenuItem("Windows經典風格"); JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem("Motif風格"); ButtonGroup flavorGroup = new ButtonGroup();//單選的菜單項 flavorGroup.add(nimbusItem); flavorGroup.add(metalItem); flavorGroup.add(windowsItem); flavorGroup.add(classicItem); flavorGroup.add(motifItem); popupMenu.add(motifItem); popupMenu.add(classicItem); popupMenu.add(windowsItem); popupMenu.add(nimbusItem); popupMenu.add(metalItem); //右鍵菜單鼠標單擊監聽器 ActionListener flavorListener = e -> { try { switch (e.getActionCommand()) { // 設置Metal風格 case "Metal風格": UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); break; // 設置Nimbus風格 case "Nimbus風格": UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); break; // 設置Windows風格 case "Windows風格": UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); break; // 設置Windows經典風格 case "Windows經典風格": UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"); break; // 設置Motif風格 case "Motif風格": UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); break; } } catch (IllegalAccessException ex) { ex.printStackTrace(); } catch (InstantiationException ex) { ex.printStackTrace(); } catch (UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } finally { //更新各個組件的風格,jframe.getContentPane()就是獲取frame的各個組件 SwingUtilities.updateComponentTreeUI(jFrame.getContentPane()); SwingUtilities.updateComponentTreeUI(jMenuBar); SwingUtilities.updateComponentTreeUI(popupMenu); } }; //右鍵菜單綁定監聽器 metalItem.addActionListener(flavorListener); nimbusItem.addActionListener(flavorListener); windowsItem.addActionListener(flavorListener); classicItem.addActionListener(flavorListener); motifItem.addActionListener(flavorListener); //文本框設置右鍵菜單 jTextArea.setComponentPopupMenu(popupMenu); //關閉窗口自動退出程序 jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); jFrame.pack(); jFrame.setLocation(400,300); jFrame.setVisible(true); } }