程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Swing編程:基本組件

Java Swing編程:基本組件

編輯:關於JAVA

今天還是繼續我們的JAVA的GUI,前幾天講了AWT,這個太重了。Swing開發圖形界面比AWT更加優秀,切實輕量級的,100%的Java實現,唯一的缺點就是比AWT略慢。

先講下Swing和AWT組件的相似處,以下圖顯示相同的組件

Swing多出來的組件

組件比較多,那些和AWT相同的組件用起來差不多,我就不多講了,就貼段全面的代碼讓大家把玩下,eg

  1. public class SwingComponent
  2. {
  3. JFrame f = new JFrame("測試");
  4. //定義一個按鈕,並為之指定圖標
  5. Icon okIcon = new ImageIcon("ico/ok.png");
  6. JButton ok = new JButton("確認" , okIcon);
  7. //定義一個單選按鈕,初始處於選中狀態
  8. JRadioButton male = new JRadioButton("男" , true);
  9. //定義一個單按鈕,初始處於沒有選中狀態
  10. JRadioButton female = new JRadioButton("女" , false);
  11. //定義一個ButtonGroup,用於將上面兩個JRadioButton組合在一起
  12. ButtonGroup bg = new ButtonGroup();
  13. //定義一個復選框,初始處於沒有選中狀態。
  14. JCheckBox marrIEd = new JCheckBox("是否已婚?" , false);
  15. String[] colors = new String[]{"紅色" , "綠色" , "藍色"};
  16. //定義一個下拉選擇框
  17. JComboBox colorChooser = new JComboBox(colors);
  18. //定義一個列表選擇框
  19. JList colorList = new JList(colors);
  20. //定義一個8行、20列的多行文本域
  21. JTextArea ta = new JTextArea(8, 20);
  22. //定義一個40列的單行文本域
  23. JTextFIEld name = new JTextFIEld(40);
  24. JMenuBar mb = new JMenuBar();
  25. JMenu file = new JMenu("文件");
  26. JMenu edit = new JMenu("編輯");
  27. //創建“新建”菜單項,並為之指定圖標
  28. Icon newIcon = new ImageIcon("ico/new.png");
  29. JMenuItem newItem = new JMenuItem("新建" , newIcon);
  30. //創建“保存”菜單項,並為之指定圖標
  31. Icon saveIcon = new ImageIcon("ico/save.png");
  32. JMenuItem saveItem = new JMenuItem("保存" , saveIcon);
  33. //創建“退出”菜單項,並為之指定圖標
  34. Icon exitIcon = new ImageIcon("ico/exit.png");
  35. JMenuItem exitItem = new JMenuItem("退出" , exitIcon);
  36. JCheckBoxMenuItem autoWrap = new JCheckBoxMenuItem("自動換行");
  37. //創建“復制”菜單項,並為之指定圖標
  38. JMenuItem copyItem = new JMenuItem("復制" , new ImageIcon("ico/copy.png"));
  39. //創建“粘貼”菜單項,並為之指定圖標
  40. JMenuItem pasteItem = new JMenuItem("粘貼" , new ImageIcon("ico/paste.png"));
  41. JMenu format = new JMenu("格式");
  42. JMenuItem commentItem = new JMenuItem("注釋");
  43. JMenuItem cancelItem = new JMenuItem("取消注釋");
  44. //定義一個右鍵菜單用於設置程序風格
  45. JPopupMenu pop = new JPopupMenu();
  46. //用於組合三個風格菜單項的ButtonGroup
  47. ButtonGroup flavorGroup = new ButtonGroup();
  48. //創建三個單選框按鈕,用於設定程序的外觀風格
  49. JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem("Metal風格" , true);
  50. JRadioButtonMenuItem WindowsItem = new JRadioButtonMenuItem("Windows風格");
  51. JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem("Motif風格");
  52. public void init()
  53. {
  54. //創建一個裝載了文本框、按鈕的JPanel
  55. JPanel bottom = new JPanel();
  56. bottom.add(name);
  57. bottom.add(ok);
  58. f.add(bottom , BorderLayout.SOUTH);
  59. //創建一個裝載了下拉選擇框、三個JCheckBox的JPanel
  60. JPanel checkPanel = new JPanel();
  61. checkPanel.add(colorChooser);
  62. bg.add(male);
  63. bg.add(female);
  64. checkPanel.add(male);
  65. checkPanel.add(female);
  66. checkPanel.add(marrIEd);
  67. //創建一個垂直排列組件的Box,盛裝多行文本域JPanel
  68. Box topLeft = Box.createVerticalBox();
  69. //使用JScrollPane作為普通組件的JVIEwPort
  70. JScrollPane taJSP = new JScrollPane(ta);
  71. topLeft.add(taJSP);
  72. topLeft.add(checkPanel);
  73. //創建一個垂直排列組件的Box,盛裝topLeft、colorList
  74. Box top = Box.createHorizontalBox();
  75. top.add(topLeft);
  76. top.add(colorList);
  77. //將top Box容器添加到窗口的中間
  78. f.add(top);
  79. //-----------下面開始組合菜單、並為菜單添加事件監聽器----------
  80. //為newItem設置快捷鍵,設置快捷鍵時要使用大寫字母
  81. newItem.setAccelerator(KeyStroke.getKeyStroke('N' , InputEvent.CTRL_MASK));
  82. newItem.addActionListener(new ActionListener()
  83. {
  84. public void actionPerformed(ActionEvent e)
  85. {
  86. ta.append("用戶單擊了“新建”菜單/n");
  87. }
  88. });
  89. //為file菜單添加菜單項
  90. file.add(newItem);
  91. file.add(saveItem);
  92. file.add(exitItem);
  93. //為edit菜單添加菜單項
  94. edit.add(autoWrap);
  95. //使用addSeparator方法來添加菜單分隔線
  96. edit.addSeparator();
  97. edit.add(copyItem);
  98. edit.add(pasteItem);
  99. commentItem.setToolTipText("將程序代碼注釋起來!");
  100. //為format菜單添加菜單項
  101. format.add(commentItem);
  102. format.add(cancelItem);
  103. //使用添加new JMenuItem("-")的方式不能添加菜單分隔符
  104. edit.add(new JMenuItem("-"));
  105. //將format菜單組合到edit菜單中,從而形成二級菜單
  106. edit.add(format);
  107. //將file、edit菜單添加到mb菜單條中
  108. mb.add(file);
  109. mb.add(edit);
  110. //為f窗口設置菜單條
  111. f.setJMenuBar(mb);
  112. //-----------下面開始組合右鍵菜單、並安裝右鍵菜單----------
  113. flavorGroup.add(metalItem);
  114. flavorGroup.add(WindowsItem);
  115. flavorGroup.add(motifItem);
  116. pop.add(metalItem);
  117. pop.add(WindowsItem);
  118. pop.add(motifItem);
  119. //為三個菜單創建事件監聽器
  120. ActionListener flavorListener = new ActionListener()
  121. {
  122. public void actionPerformed(ActionEvent e)
  123. {
  124. try
  125. {
  126. if (e.getActionCommand().equals("Metal風格"))
  127. {
  128. changeFlavor(1);
  129. }
  130. else if (e.getActionCommand().equals("Windows風格"))
  131. {
  132. changeFlavor(2);
  133. }
  134. else if (e.getActionCommand().equals("Motif風格"))
  135. {
  136. changeFlavor(3);
  137. }
  138. }
  139. catch (Exception ee)
  140. {
  141. ee.printStackTrace();
  142. }
  143. }
  144. };
  145. //為三個菜單添加事件監聽器
  146. metalItem.addActionListener(flavorListener);
  147. WindowsItem.addActionListener(flavorListener);
  148. motifItem.addActionListener(flavorListener);
  149. //調用該方法即可設置右鍵菜單,無需使用事件機制
  150. ta.setComponentPopupMenu(pop);
  151. //設置關閉窗口時,退出程序
  152. f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  153. f.pack();
  154. f.setVisible(true);
  155. }
  156. //定義一個方法,用於改變界面風格
  157. private void changeFlavor(int flavor)throws Exception
  158. {
  159. switch (flavor)
  160. {
  161. //設置Metal風格
  162. case 1:
  163. UIManager.setLookAndFeel("Javax.swing.plaf.metal.MetalLookAndFeel");
  164. break;
  165. //設置Windows風格
  166. case 2:
  167. UIManager.setLookAndFeel("com.sun.Java.swing.plaf.windows.WindowsLookAndFeel");
  168. break;
  169. //設置Motif風格
  170. case 3:
  171. UIManager.setLookAndFeel("com.sun.Java.swing.plaf.motif.MotifLookAndFeel");
  172. break;
  173. }
  174. //更新f窗口內頂級容器以及內部所有組件的UI
  175. SwingUtilitIEs.updateComponentTreeUI(f.getContentPane());
  176. //更新mb菜單條以及內部所有組件的UI
  177. SwingUtilitIEs.updateComponentTreeUI(mb);
  178. //更新pop右鍵菜單以及內部所有組件的UI
  179. SwingUtilitIEs.updateComponentTreeUI(pop);
  180. }
  181. public static void main(String[] args)
  182. {
  183. //設置Swing窗口使用Java風格
  184. JFrame.setDefaultLookAndFeelDecorated(true);
  185. new SwingComponent().init();
  186. }
  187. }

下面Swing的特殊組件,我將以舉例的形式,這樣最能主觀理解,大家一定要動手試試

首先是JToolBar

  1. public class TestJToolBar
  2. {
  3. JFrame jf = new JFrame("測試工具條");
  4. JTextArea jta = new JTextArea(6, 35);
  5. JToolBar jtb = new JToolBar();
  6. JMenuBar jmb = new JMenuBar();
  7. JMenu edit = new JMenu("編輯");
  8. Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
  9. //創建"粘貼"Action,該Action用於創建菜單項、工具按鈕和普通按鈕
  10. Action pasteAction = new AbstractAction("粘貼", new ImageIcon("ico/paste.png"))
  11. {
  12. public void actionPerformed(ActionEvent e)
  13. {
  14. //如果剪貼板中包含stringFlavor內容
  15. if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor))
  16. {
  17. try
  18. {
  19. //取出剪貼板中stringFlavor內容
  20. String content = (String)clipboard.getData(DataFlavor.stringFlavor);
  21. //將選中內容替換成剪貼板中的內容
  22. jta.replaceRange(content , jta.getSelectionStart() , jta.getSelectionEnd());
  23. }
  24. catch (Exception ee)
  25. {
  26. ee.printStackTrace();
  27. }
  28. }
  29. }
  30. };
  31. //創建"復制"Action
  32. Action copyAction = new AbstractAction("復制", new ImageIcon("ico/copy.png"))
  33. {
  34. public void actionPerformed(ActionEvent e)
  35. {
  36. StringSelection contents = new StringSelection(jta.getSelectedText());
  37. //將StringSelection對象放入剪貼板
  38. clipboard.setContents(contents, null);
  39. //如果剪貼板中包含stringFlavor內容
  40. if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor))
  41. {
  42. //將pasteAction激活
  43. pasteAction.setEnabled(true);
  44. }
  45. }
  46. };
  47. public void init()
  48. {
  49. //pasteAction默認處於不激活狀態
  50. pasteAction.setEnabled(false);
  51. jf.add(new JScrollPane(jta));
  52. //以Action創建按鈕,並將該按鈕添加到Panel中
  53. JButton copyBn = new JButton(copyAction);
  54. JButton pasteBn = new JButton(pasteAction);
  55. JPanel jp = new JPanel();
  56. jp.add(copyBn);
  57. jp.add(pasteBn);
  58. jf.add(jp , BorderLayout.SOUTH);
  59. //向工具條中添加Action對象,該對象將會轉換成工具按鈕
  60. jtb.add(copyAction);
  61. jtb.addSeparator();
  62. jtb.add(pasteAction);
  63. //向菜單中添加Action對象,該對象將會轉換成菜單項
  64. edit.add(copyAction);
  65. edit.add(pasteAction);
  66. //將edit菜單添加到菜單條中
  67. jmb.add(edit);
  68. jf.setJMenuBar(jmb);
  69. //設置工具條和工具按鈕之間的距離
  70. jtb.setMargin(new Insets(20 ,10 , 5 , 30));
  71. //向窗口中添加工具條
  72. jf.add(jtb , BorderLayout.NORTH);
  73. jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  74. jf.pack();
  75. jf.setVisible(true);
  76. }
  77. public static void main(String[] args)
  78. {
  79. new TestJToolBar().init();
  80. }
  81. }

繼續講Swing的特殊組件,JColorChooser和JFileChooser這兩個東西在awt中都是利用系統的控件,這樣導致不同操作系統有不同的界面,用Swing就避免了這些問題。下面就先看JColorChooser的例子,eg(一個簡單畫圖程序)

  1. public class HandDraw
  2. {
  3. //畫圖區的寬度
  4. private final int AREA_WIDTH = 500;
  5. //畫圖區的高度
  6. private final int AREA_HEIGHT = 400;
  7. //下面的preX、preY保存了上一次鼠標拖動事件的鼠標座標
  8. private int preX = -1;
  9. private int preY = -1;
  10. //定義一個右鍵菜單用於設置畫筆顏色
  11. JPopupMenu pop = new JPopupMenu();
  12. JMenuItem chooseColor = new JMenuItem("選擇顏色");
  13. //定義一個BufferedImage對象
  14. BufferedImage image = new BufferedImage(AREA_WIDTH , AREA_HEIGHT ,
  15. BufferedImage.TYPE_INT_RGB);
  16. //獲取image對象的Graphics
  17. Graphics g = image.getGraphics();
  18. private JFrame f = new JFrame("簡單手繪程序");
  19. private DrawCanvas drawArea = new DrawCanvas();
  20. //用於保存需要繪制什麼圖形的字符串屬性
  21. private String shape = "";
  22. //用於保存畫筆顏色
  23. private Color foreColor = new Color(255, 0 ,0);
  24. public void init()
  25. {
  26. chooseColor.addActionListener(new ActionListener()
  27. {
  28. public void actionPerformed(ActionEvent ae)
  29. {
  30. //下面代碼直接彈出一個模式的顏色選擇器對話框,並返回用戶選擇的顏色
  31. //foreColor = JColorChooser.showDialog(f , "選擇畫筆顏色" , foreColor);
  32. //下面代碼則可以彈出一個非模式的顏色選擇對話框,
  33. //並可以分別為“確定”按鈕、“取消”按鈕指定事件監聽器
  34. final JColorChooser colorPane = new JColorChooser(foreColor);
  35. JDialog jd = JColorChooser.createDialog(f ,"選擇畫筆顏色",false,
  36. colorPane, new ActionListener()
  37. {
  38. public void actionPerformed(ActionEvent ae)
  39. {
  40. foreColor = colorPane.getColor();
  41. }
  42. }, null);
  43. jd.setVisible(true);
  44. }
  45. });
  46. //將菜單項組合成右鍵菜單
  47. pop.add(chooseColor);
  48. //將右鍵菜單添加到drawArea對象中
  49. drawArea.setComponentPopupMenu(pop);
  50. //將image對象的背景色填充成白色
  51. g.fillRect(0 , 0 ,AREA_WIDTH , AREA_HEIGHT);
  52. drawArea.setPreferredSize(new Dimension(AREA_WIDTH , AREA_HEIGHT));
  53. //監聽鼠標移動動作
  54. drawArea.addMouseMotionListener(new MouseMotionAdapter()
  55. {
  56. //實現按下鼠標鍵並拖動的事件處理器
  57. public void mouseDragged(MouseEvent e)
  58. {
  59. //如果preX和preY大於0
  60. if (preX > 0 && preY > 0)
  61. {
  62. //設置當前顏色
  63. g.setColor(foreColor);
  64. //繪制從上一次鼠標拖動事件點到本次鼠標拖動事件點的線段
  65. g.drawLine(preX , preY , e.getX() , e.getY());
  66. }
  67. //將當前鼠標事件點的X、Y座標保存起來
  68. preX = e.getX();
  69. preY = e.getY();
  70. //重繪drawArea對象
  71. drawArea.repaint();
  72. }
  73. });
  74. //監聽鼠標事件
  75. drawArea.addMouseListener(new MouseAdapter()
  76. {
  77. //實現鼠標松開的事件處理器
  78. public void mouseReleased(MouseEvent e)
  79. {
  80. //松開鼠標鍵時,把上一次鼠標拖動事件的X、Y座標設為-1。
  81. preX = -1;
  82. preY = -1;
  83. }
  84. });
  85. f.add(drawArea);
  86. f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  87. f.pack();
  88. f.setVisible(true);
  89. }
  90. public static void main(String[] args)
  91. {
  92. new HandDraw().init();
  93. }
  94. //讓畫圖區域繼承JPanel類
  95. class DrawCanvas extends JPanel
  96. {
  97. //重寫JPanel的paint方法,實現繪畫
  98. public void paint(Graphics g)
  99. {
  100. //將image繪制到該組件上
  101. g.drawImage(image , 0 , 0 , null);
  102. }
  103. }
  104. }

下面舉個JFileChooser,這些東西組件不是很常用,大家可以收藏著,到用的時候翻出來看,eg

  1. public class ImageVIEwer
  2. {
  3. final int PREVIEW_SIZE = 100;
  4. JFrame jf = new JFrame("簡單圖片查看器");
  5. JMenuBar menuBar = new JMenuBar();
  6. //該label用於顯示圖片
  7. JLabel label = new JLabel();
  8. //以當前路徑創建文件選擇器
  9. JFileChooser chooser = new JFileChooser(".");
  10. JLabel Accessory = new JLabel();
  11. ExtensionFileFilter filter = new ExtensionFileFilter();
  12. public void init()
  13. {
  14. //-------------------下面開始初始化JFileChooser的相關屬性-----------------
  15. // 創建一個FileFilter
  16. filter.addExtension("jpg");
  17. filter.addExtension("jpeg");
  18. filter.addExtension("gif");
  19. filter.addExtension("png");
  20. filter.setDescription("圖片文件(*.jpg,*.jpeg,*.gif,*.png)");
  21. chooser.addChoosableFileFilter(filter);
  22. //禁止“文件類型”下拉列表中顯示“所有文件”選項。
  23. chooser.setAcceptAllFileFilterUsed(false);
  24. //為文件選擇器指定自定義的FileVIEw對象
  25. chooser.setFileVIEw(new FileIconVIEw(filter));
  26. //為文件選擇器指定一個預覽圖片的附件組件
  27. chooser.setAccessory(Accessory);
  28. //設置預覽圖片組件的大小和邊框
  29. Accessory.setPreferredSize(new Dimension(PREVIEW_SIZE, PREVIEW_SIZE));
  30. Accessory.setBorder(BorderFactory.createEtchedBorder());
  31. //用於檢測被選擇文件的改變事件
  32. chooser.addPropertyChangeListener(new PropertyChangeListener()
  33. {
  34. public void propertyChange(PropertyChangeEvent event)
  35. {
  36. //JFileChooser的被選文件已經發生了改變
  37. if (event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)
  38. {
  39. //獲取用戶選擇的新文件
  40. File f = (File) event.getNewValue();
  41. if (f == null)
  42. {
  43. Accessory.setIcon(null);
  44. return;
  45. }
  46. //將所文件讀入ImageIcon對象中
  47. ImageIcon icon = new ImageIcon(f.getPath());
  48. //如果圖像太大,則縮小它
  49. if(icon.getIconWidth() > PREVIEW_SIZE)
  50. {
  51. icon = new ImageIcon(icon.getImage()
  52. .getScaledInstance(PREVIEW_SIZE, -1, Image.SCALE_DEFAULT));
  53. }
  54. //改變Accessory Label的圖標
  55. Accessory.setIcon(icon);
  56. }
  57. }
  58. });
  59. //----------下面代碼開始為該窗口安裝菜單------------
  60. JMenu menu = new JMenu("文件");
  61. menuBar.add(menu);
  62. JMenuItem openItem = new JMenuItem("打開");
  63. menu.add(openItem);
  64. //單擊openItem菜單項顯示“打開文件”的對話框
  65. openItem.addActionListener(new ActionListener()
  66. {
  67. public void actionPerformed(ActionEvent event)
  68. {
  69. //設置文件對話框的當前路徑
  70. //chooser.setCurrentDirectory(new File("."));
  71. //顯示文件對話框
  72. int result = chooser.showDialog(jf , "打開圖片文件");
  73. //如果用戶選擇了APPROVE(贊同)按鈕,即打開,保存及其等效按鈕
  74. if(result == JFileChooser.APPROVE_OPTION)
  75. {
  76. String name = chooser.getSelectedFile().getPath();
  77. //顯示指定圖片
  78. label.setIcon(new ImageIcon(name));
  79. }
  80. }
  81. });
  82. JMenuItem exitItem = new JMenuItem("退出");
  83. menu.add(exitItem);
  84. exitItem.addActionListener(new ActionListener()
  85. {
  86. public void actionPerformed(ActionEvent event)
  87. {
  88. System.exit(0);
  89. }
  90. });
  91. jf.setJMenuBar(menuBar);
  92. //添加用於顯示圖片的JLabel組件。
  93. jf.add(new JScrollPane(label));
  94. jf.setSize(500, 400);
  95. jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  96. jf.setVisible(true);
  97. }
  98. public static void main(String[] args)
  99. {
  100. new ImageVIEwer().init();
  101. }
  102. }
  103. //創建FileFilter的子類,用以實現文件過濾功能
  104. class ExtensionFileFilter extends FileFilter
  105. {
  106. private String description = "";
  107. private ArrayList<String> extensions = new ArrayList<String>();
  108. //自定義方法,用於添加文件擴展名
  109. public void addExtension(String extension)
  110. {
  111. if (!extension.startsWith("."))
  112. {
  113. extension = "." + extension;
  114. extensions.add(extension.toLowerCase());
  115. }
  116. }
  117. //用於設置該文件過濾器的描述文本
  118. public void setDescription(String aDescription)
  119. {
  120. description = aDescription;
  121. }
  122. //繼承FileFilter類必須實現的抽象方法,返回該文件過濾器的描述文本
  123. public String getDescription()
  124. {
  125. return description;
  126. }
  127. //繼承FileFilter類必須實現的抽象方法,判斷該文件過濾器是否接受該文件
  128. public boolean accept(File f)
  129. {
  130. //如果該文件是路徑,接受該文件
  131. if (f.isDirectory()) return true;
  132. //將文件名轉為小寫(全部轉為小寫後比較,用於忽略文件名大小寫)
  133. String name = f.getName().toLowerCase();
  134. //遍歷所有可接受的擴展名,如果擴展名相同,該文件就可接受。
  135. for (String extension : extensions)
  136. {
  137. if (name.endsWith(extension))
  138. {
  139. return true;
  140. }
  141. }
  142. return false;
  143. }
  144. }
  145. //自定義一個FileVIEw類,用於為指定類型的指定圖標
  146. class FileIconVIEw extends FileVIEw
  147. {
  148. private FileFilter filter;
  149. public FileIconVIEw(FileFilter filter)
  150. {
  151. this.filter = filter;
  152. }
  153. //如果文件不是目錄,並且不是
  154. public Icon getIcon(File f)
  155. {
  156. if (!f.isDirectory() && filter.accept(f))
  157. {
  158. return new ImageIcon("ico/pict.png");
  159. }
  160. else if (f.isDirectory())
  161. {
  162. //獲取所有根路徑
  163. File[] fList = File.listRoots();
  164. for (File tmp : fList)
  165. {
  166. //如果該路徑是根路徑
  167. if (tmp.equals(f))
  168. {
  169. return new ImageIcon("ico/dsk.png");
  170. }
  171. }
  172. return new ImageIcon("ico/folder.png");
  173. }
  174. //使用默認圖標
  175. else
  176. {
  177. return null;
  178. }
  179. }
  180. }

注意:以上圖片我都沒給,自己隨便弄幾張看看效果

JOptionPane是一種特殊的JFrame,他的出現是為了方便我們創建一些簡單的對話框,你也可以用JFrame搞一個,但很繁瑣,但如果你用UI的拖拽工具那就沒什麼了。eg(各種對話框)

  1. public class TestJOptionPane
  2. {
  3. JFrame jf = new JFrame("測試JOptionPane");
  4. //分別定義6個面板用於定義對話框的幾種選項
  5. private ButtonPanel messagePanel;
  6. private ButtonPanel messageTypePanel;
  7. private ButtonPanel msgPanel;
  8. private ButtonPanel confirmPanel;
  9. private ButtonPanel optionsPanel;
  10. private ButtonPanel inputPanel;
  11. private String messageString = "消息區內容";
  12. private Icon messageIcon = new ImageIcon("ico/heart.png");
  13. private Object messageObject = new Date();
  14. private Component messageComponent = new JButton("組件消息");
  15. private JButton msgBn = new JButton("消息對話框");
  16. private JButton confrimBn = new JButton("確認對話框");
  17. private JButton inputBn = new JButton("輸入對話框");
  18. private JButton optionBn = new JButton("選項對話框");
  19. public void init()
  20. {
  21. JPanel top = new JPanel();
  22. top.setBorder(new TitledBorder(new EtchedBorder(), "對話框的通用選項" ,
  23. TitledBorder.CENTER ,TitledBorder.TOP ));
  24. top.setLayout(new GridLayout(1 , 2));
  25. //消息類型Panel,該Panel中的選項決定對話框的圖標
  26. messageTypePanel = new ButtonPanel("選擇消息的類型",
  27. new String[]{"ERROR_MESSAGE", "INFORMATION_MESSAGE", "WARNING_MESSAGE",
  28. "QUESTION_MESSAGE", "PLAIN_MESSAGE" });
  29. //消息內容類型的Panel,該Panel中的選項決定對話框的消息區的內容
  30. messagePanel = new ButtonPanel("選擇消息內容的類型",
  31. new String[]{"字符串消息", "圖標消息", "組件消息", "普通對象消息" , "Object[]消息"});
  32. top.add(messageTypePanel);
  33. top.add(messagePanel);
  34. JPanel bottom = new JPanel();
  35. bottom.setBorder(new TitledBorder(new EtchedBorder(), "彈出不同的對話框" ,
  36. TitledBorder.CENTER ,TitledBorder.TOP));
  37. bottom.setLayout(new GridLayout(1 , 4));
  38. //創建用於彈出消息對話框的Panel
  39. msgPanel = new ButtonPanel("消息對話框", null);
  40. msgBn.addActionListener(new ShowAction());
  41. msgPanel.add(msgBn);
  42. //創建用於彈出確認對話框的Panel
  43. confirmPanel = new ButtonPanel("確認對話框",
  44. new String[]{"DEFAULT_OPTION", "YES_NO_OPTION", "YES_NO_CANCEL_OPTION",
  45. "OK_CANCEL_OPTION"});
  46. confrimBn.addActionListener(new ShowAction());
  47. confirmPanel.add(confrimBn);
  48. //創建用於彈出輸入對話框的Panel
  49. inputPanel = new ButtonPanel("輸入對話框",
  50. new String[]{"單行文本框","下拉列表選擇框"});
  51. inputBn.addActionListener(new ShowAction());
  52. inputPanel.add(inputBn);
  53. //創建用於彈出選項對話框的Panel
  54. optionsPanel = new ButtonPanel("選項對話框",
  55. new String[]{"字符串選項", "圖標選項", "對象選項"});
  56. optionBn.addActionListener(new ShowAction());
  57. optionsPanel.add(optionBn);
  58. bottom.add(msgPanel);
  59. bottom.add(confirmPanel);
  60. bottom.add(inputPanel);
  61. bottom.add(optionsPanel);
  62. Box box = new Box(BoxLayout.Y_AXIS);
  63. box.add(top);
  64. box.add(bottom);
  65. jf.add(box);
  66. jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  67. jf.pack();
  68. jf.setVisible(true);
  69. }
  70. //根據用戶選擇返回選項類型
  71. private int getOptionType()
  72. {
  73. if (confirmPanel.getSelection().equals("DEFAULT_OPTION"))
  74. return JOptionPane.DEFAULT_OPTION;
  75. else if (confirmPanel.getSelection().equals("YES_NO_OPTION"))
  76. return JOptionPane.YES_NO_OPTION;
  77. else if (confirmPanel.getSelection().equals("YES_NO_CANCEL_OPTION"))
  78. return JOptionPane.YES_NO_CANCEL_OPTION;
  79. else
  80. return JOptionPane.OK_CANCEL_OPTION;
  81. }
  82. //根據用戶選擇返回消息
  83. private Object getMessage()
  84. {
  85. if (messagePanel.getSelection().equals("字符串消息"))
  86. return messageString;
  87. else if (messagePanel.getSelection().equals("圖標消息"))
  88. return messageIcon;
  89. else if (messagePanel.getSelection().equals("組件消息"))
  90. return messageComponent;
  91. else if(messagePanel.getSelection().equals("普通對象消息"))
  92. return messageObject;
  93. else
  94. return new Object[]{messageString , messageIcon ,
  95. messageObject , messageComponent};
  96. }
  97. //根據用戶選擇返回消息類型(決定圖標區的圖標)
  98. private int getDialogType()
  99. {
  100. if (messageTypePanel.getSelection().equals("ERROR_MESSAGE"))
  101. return JOptionPane.ERROR_MESSAGE;
  102. else if (messageTypePanel.getSelection().equals("INFORMATION_MESSAGE"))
  103. return JOptionPane.INFORMATION_MESSAGE;
  104. else if (messageTypePanel.getSelection().equals("WARNING_MESSAGE"))
  105. return JOptionPane.WARNING_MESSAGE;
  106. else if(messageTypePanel.getSelection().equals("QUESTION_MESSAGE"))
  107. return JOptionPane.QUESTION_MESSAGE;
  108. else
  109. return JOptionPane.PLAIN_MESSAGE;
  110. }
  111. private Object[] getOptions()
  112. {
  113. if (optionsPanel.getSelection().equals("字符串選項"))
  114. return new String[]{"a" , "b" , "c" , "d"};
  115. else if (optionsPanel.getSelection().equals("圖標選項"))
  116. return new Icon[]{new ImageIcon("ico/1.gif") , new ImageIcon("ico/2.gif"),
  117. new ImageIcon("ico/3.gif"),new ImageIcon("ico/4.gif")};
  118. else
  119. return new Object[]{new Date() ,new Date() , new Date()};
  120. }
  121. //為各按鈕定義事件監聽器
  122. private class ShowAction implements ActionListener
  123. {
  124. public void actionPerformed(ActionEvent event)
  125. {
  126. if (event.getActionCommand().equals("確認對話框"))
  127. {
  128. JOptionPane.showConfirmDialog(jf , getMessage(),"確認對話框",
  129. getOptionType(), getDialogType());
  130. }
  131. else if (event.getActionCommand().equals("輸入對話框"))
  132. {
  133. if (inputPanel.getSelection().equals("單行文本框"))
  134. {
  135. JOptionPane.showInputDialog(jf, getMessage(), "輸入對話框", getDialogType());
  136. }
  137. else
  138. {
  139. JOptionPane.showInputDialog(jf, getMessage(), "輸入對話框", getDialogType(),
  140. null, new String[] {"輕量級J2EE企業應用實戰", "Struts2權威指南"},
  141. "Struts2權威指南");
  142. }
  143. }
  144. else if (event.getActionCommand().equals("消息對話框"))
  145. {
  146. JOptionPane.showMessageDialog(jf,getMessage(),"消息對話框",getDialogType());
  147. }
  148. else if (event.getActionCommand().equals("選項對話框"))
  149. {
  150. JOptionPane.showOptionDialog(jf , getMessage() , "選項對話框", getOptionType(),
  151. getDialogType(), null, getOptions(), "a");
  152. }
  153. }
  154. }
  155. public static void main(String[] args)
  156. {
  157. new TestJOptionPane().init();
  158. }
  159. }
  160. //定義一個JPanel類擴展類,該類的對象包含多個縱向排列的JRadioButton控件
  161. //且Panel擴展類可以指定一個字符串作為TitledBorder
  162. class ButtonPanel extends JPanel
  163. {
  164. private ButtonGroup group;
  165. public ButtonPanel(String title, String[] options)
  166. {
  167. setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), title));
  168. setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
  169. group = new ButtonGroup();
  170. for (int i = 0; options!= null && i < options.length; i++)
  171. {
  172. JRadioButton b = new JRadioButton(options[i]);
  173. b.setActionCommand(options[i]);
  174. add(b);
  175. group.add(b);
  176. b.setSelected(i == 0);
  177. }
  178. }
  179. //定義一個方法,用於返回用戶選擇的選項
  180. public String getSelection()
  181. {
  182. return group.getSelection().getActionCommand();
  183. }
  184. }

看似簡單,用起來花樣還是挺多的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved