JavaSwing编程:基本组件

今天还是继续我们的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.     //定义一个右键菜单用于设置程序风格  
  46.     JPopupMenu pop = new JPopupMenu();  
  47.     //用于组合三个风格菜单项的ButtonGroup  
  48.     ButtonGroup flavorGroup = new ButtonGroup();  
  49.     //创建三个单选框按钮,用于设定程序的外观风格  
  50.     JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem("Metal风格" , true);  
  51.     JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem("Windows风格");  
  52.     JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem("Motif风格");  
  53.  
  54.     public void init()  
  55.     {  
  56.         //创建一个装载了文本框、按钮的JPanel  
  57.         JPanel bottom = new JPanel();  
  58.         bottom.add(name);  
  59.         bottom.add(ok);  
  60.         f.add(bottom , BorderLayout.SOUTH);  
  61.         //创建一个装载了下拉选择框、三个JCheckBox的JPanel  
  62.         JPanel checkPanel = new JPanel();  
  63.         checkPanel.add(colorChooser);  
  64.         bg.add(male);  
  65.         bg.add(female);  
  66.         checkPanel.add(male);  
  67.         checkPanel.add(female);  
  68.         checkPanel.add(married);  
  69.         //创建一个垂直排列组件的Box,盛装多行文本域JPanel  
  70.         Box topLeft = Box.createVerticalBox();  
  71.         //使用JScrollPane作为普通组件的JViewPort  
  72.         JScrollPane taJsp = new JScrollPane(ta);  
  73.         topLeft.add(taJsp);  
  74.         topLeft.add(checkPanel);  
  75.         //创建一个垂直排列组件的Box,盛装topLeft、colorList  
  76.         Box top = Box.createHorizontalBox();  
  77.         top.add(topLeft);  
  78.         top.add(colorList);  
  79.         //将top Box容器添加到窗口的中间  
  80.         f.add(top);   
  81.         //-----------下面开始组合菜单、并为菜单添加事件监听器----------  
  82.         //为newItem设置快捷键,设置快捷键时要使用大写字母  
  83.         newItem.setAccelerator(KeyStroke.getKeyStroke('N' , InputEvent.CTRL_MASK));   
  84.         newItem.addActionListener(new ActionListener()  
  85.         {  
  86.             public void actionPerformed(ActionEvent e)  
  87.             {  
  88.                 ta.append("用户单击了“新建”菜单/n");  
  89.             }  
  90.         });  
  91.         //为file菜单添加菜单项  
  92.         file.add(newItem);  
  93.         file.add(saveItem);  
  94.         file.add(exitItem);  
  95.         //为edit菜单添加菜单项  
  96.         edit.add(autoWrap);  
  97.         //使用addSeparator方法来添加菜单分隔线  
  98.         edit.addSeparator();  
  99.         edit.add(copyItem);  
  100.         edit.add(pasteItem);  
  101.         commentItem.setToolTipText("将程序代码注释起来!");  
  102.         //为format菜单添加菜单项  
  103.         format.add(commentItem);  
  104.         format.add(cancelItem);  
  105.         //使用添加new JMenuItem("-")的方式不能添加菜单分隔符  
  106.         edit.add(new JMenuItem("-"));  
  107.         //将format菜单组合到edit菜单中,从而形成二级菜单  
  108.         edit.add(format);  
  109.         //将file、edit菜单添加到mb菜单条中  
  110.         mb.add(file);  
  111.         mb.add(edit);  
  112.         //为f窗口设置菜单条  
  113.         f.setJMenuBar(mb);  
  114.         //-----------下面开始组合右键菜单、并安装右键菜单----------  
  115.         flavorGroup.add(metalItem);  
  116.         flavorGroup.add(windowsItem);  
  117.         flavorGroup.add(motifItem);  
  118.         pop.add(metalItem);  
  119.         pop.add(windowsItem);  
  120.         pop.add(motifItem);  
  121.         //为三个菜单创建事件监听器  
  122.         ActionListener flavorListener = new ActionListener()  
  123.         {  
  124.             public void actionPerformed(ActionEvent e)  
  125.             {  
  126.                 try 
  127.                 {  
  128.                     if (e.getActionCommand().equals("Metal风格"))  
  129.                     {  
  130.                         changeFlavor(1);  
  131.                     }  
  132.                     else if (e.getActionCommand().equals("Windows风格"))  
  133.                     {  
  134.                         changeFlavor(2);  
  135.                     }  
  136.                     else if (e.getActionCommand().equals("Motif风格"))  
  137.                     {  
  138.                         changeFlavor(3);  
  139.                     }  
  140.                 }  
  141.                 catch (Exception ee)  
  142.                 {  
  143.                     ee.printStackTrace();  
  144.                 }  
  145.             }  
  146.         };  
  147.         //为三个菜单添加事件监听器  
  148.         metalItem.addActionListener(flavorListener);  
  149.         windowsItem.addActionListener(flavorListener);  
  150.         motifItem.addActionListener(flavorListener);  
  151.         //调用该方法即可设置右键菜单,无需使用事件机制  
  152.         ta.setComponentPopupMenu(pop);   
  153.         //设置关闭窗口时,退出程序  
  154.         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  155.         f.pack();  
  156.         f.setVisible(true);  
  157.     }  
  158.  
  159.     //定义一个方法,用于改变界面风格  
  160.     private void changeFlavor(int flavor)throws Exception  
  161.     {  
  162.         switch (flavor)  
  163.         {  
  164.             //设置Metal风格  
  165.             case 1:  
  166.                 UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");  
  167.                 break;  
  168.             //设置Windows风格  
  169.             case 2:  
  170.                 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");  
  171.                 break;  
  172.             //设置Motif风格  
  173.             case 3:  
  174.                 UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");  
  175.                 break;            
  176.         }  
  177.         //更新f窗口内顶级容器以及内部所有组件的UI  
  178.         SwingUtilities.updateComponentTreeUI(f.getContentPane());  
  179.         //更新mb菜单条以及内部所有组件的UI  
  180.         SwingUtilities.updateComponentTreeUI(mb);  
  181.         //更新pop右键菜单以及内部所有组件的UI  
  182.         SwingUtilities.updateComponentTreeUI(pop);  
  183.  
  184.     }  
  185.     public static void main(String[] args)   
  186.     {  
  187.         //设置Swing窗口使用Java风格  
  188.         JFrame.setDefaultLookAndFeelDecorated(true);   
  189.         new SwingComponent().init();  
  190.     }  
  191. }  

下面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.     }  

继续讲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.       &nb

    网页标题:JavaSwing编程:基本组件
    当前地址:http://www.shufengxianlan.com/qtweb/news4/445254.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联