Java图形化界面编程——Swing编程

目录

1 Swing概述

2 Swing基本组件的用法

2.1 Swing组件层次

2.2 AWT组件的Swing实现

2.3 为组件设置边框

2.4 使用JToolBar创建工具条

2.5 JColorChooser和JFileChooser

JColorChooser

JFileChooser

2.6 JOptionPane

基本概述

消息对话框:

确认对话框:

输入对话框:

选项对话框:

Swing概述

        Swing是完完全全由Java实现的,不再依赖本地平台的GUI,因此可以在所有平台上都保持相同的界面外观,独立于本地平台的Swing组件被称为轻量级组件;而依赖于本地平台的AWT组件被称为重量级组件

        由于Swing的所有组件完全采用Java实现,不再调用本地平台的GUI,所有导致Swing图形界面的显示速度要比AWT图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差距并无大碍。

使用Swing的优势:

        1.Swing组件不再依赖于本地平台的GUI,无需采用各种平台的GUI交集,因此Swing提供了大量图形界面组件,远超出了AWT提供的图形界面组件集;

        2.Swing组件不再依赖于本地平台GUI,因此不会产生与平台相关的bug;

        3.Swing组件在各个平台上运行时可以保证相同的图形界面外观。

Swing的特征:

        1.Swing组件采用MVC(Model-View-Controller,即模型-视图-控制器)设计模式:

        模型(Model):用于维护组建的各种状态;

        视图(View):是组件的可视化表现;

        控制器(Controller):用于控制对于各种事务、组件做出响应。

        当模型发生改变时,他会通知所有依赖它的视图,视图会根据模型数据来更新自己。Swing使用UI代理来包装视图和控制器,还有一个模型对象来维护该组件的状态。

        例如,按钮JButton有一个维护其状态信息的模型ButtonModel对象。Swing组件的模型是自动设置的,因此一般都使用JButton,而无需关心ButtonModel对象。

        2.Swing在不同平台上表现一致,并且有能力提供本地平台不支持的显示外观。由于Swing采用MVC模式来维护各组件,所以当组件的外观被改变时,对组件的状态信息没有影响。音系,Swing可以使用插拔式外观感觉(Pluggable Look And Feel  :  PLAF) 来控制组件外观,使得Swing图形界面在同一个平台上运行时能拥有不同的外观,用户可以选择自己喜欢的外观。相比之下,AWT图形界面中,由于控制组件外观的对等类与具体平台相关,因此AWT组件总是具有与本地平台相关的外观。

2 Swing基本组件的用法

2.1 Swing组件层次

        大部分Swing组件都是JComponent抽象类的直接或间接子类(并不是全部的Swing组件),JComponent类定义了所有子类组建的通用方式,JComponent类是AWT里java.awt.Container类的子类,这也是AWT和Swing的联系之一。绝大部分Swing组件类继承了Container类,所以Swing组件都可作为容器使用(JFrame继承了Frame类)。

Swing组件和AWT组件的对应关系:

        大部分情况下,只需要在AWT组件的名字前面加一个J,就可以得到其对应的Swing组件名称,但有几个例外:

        1.JcomboBox:对应AWT里的Choice组件,但比Choice组件丰富;

        2.JFileChooser:对应AWT里的FileDialog组件;

        3.JScrollBar:对应于AWT里的Scrollbar组件,注意两个组件类名中b字母的大小写;

        4.JCheckBox:对应于AWT里的Checkbox组件,大小写区别;

        5.JCheckBoxMenuItem:对应AWT里的CheckboxMenuItem组件,大小写。

Swing组件按照功能分类:

        1.顶层容器:JFrame,JApplet,JDialog和JWindow。

        2.中间容器:JPanel,JScrollPane,JSplitPane,JToolBar等。

        3.特殊容器:在用户界面上 具有特殊作用的中间容器,如JIntemalFrame,JRootPane,JLayeredPane和JDestopPane等。

        4.基本组件:实现人机交互的组件,如JButton,JComboBox,JList,JMenu,JSlider等。

        5.不可编辑信息的显示组件:向用户显示能够编辑的格式化信息的组件,如JTable,JTextArea和JTextField等。

        6.特殊对话框组件:可以直接产生特殊对话框的组件,如JColorChooser和JFileChooser等。

2.2 AWT组件的Swing实现

        Swing为除Canvas之外的所有AWT组件提供了相应的实现,Swing组件比AWT组件的功能更加强大。相对于AWT组件,Swing组件具有如下4个额外的功能:

        1.可以为Swing组件设置提示信息。使用setToolTipText()方法,为组件设置对用户有帮助的提示信息。

        2.很多Swing组件如按钮、标签、菜单项等,除使用文字外,还可以使用图标修饰自己。为了允许在Swing组件中使用图标,Swing为Icon接口提供了一个实现类:ImageIcon,该实现类代表一个图像图标。

        3.支持插拔式的外观风格。每个JComponent对象都有一个相应的ComponentUI对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。ComponentUI对象依赖当前使用的PLAF,使用UIManager.setLookAndFeel()方法可以改变图形界面的外观风格。

        4.支持设置边框。Swing组件可以设置一个或多个边框。Swing中提供了各式各样的边框供用户使用,也能建立组合边框或自己设计边框。一种空白边框可以用于增大组件,同时协调布局管理器中的组件进行合理的布局。

        每个Swing组件都有一个对应的UI类,例如JButton组件就有一个对应的ButtonUI类来作为UI代理。每个Swing组建的UI代理的类名总是将该Swing组件类名的J去掉,然后在后面添加UI后缀。UI代理类通常是一个抽象基类,不同的PLAF会有不同的UI代理实现类。Swing类库中包含了几套UI代理,分别放在不同的包下,每套UI代理都几乎包含了所有Swing组件的ComponentUI实现,每套这样的实现都被称为一种PLAF实现。

        如果需要改变程序的外观风格,可以使用如下代码:


   
   
  1. / /容器
  2. JFrame jf =new JFrame();
  3. try{
  4. / /设置外观风格
  5. UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windowsLookAndFeel");
  6. / /刷新jf容器及其内部组件的外观
  7. SwingUtilities.updateComponentTreeUI(jf);
  8. }catch( Exception e){
  9. e.printStackTrace();
  10. }

案例:

        下面使用Swing组件完成下图效果:


   
   
  1. public class SwingComponentDemo {
  2. JFrame f = new JFrame( "测试Swing基本组件");
  3. //声明菜单相关的组件
  4. JMenuBar menuBar = new JMenuBar();
  5. JMenu fileMenue = new JMenu( "文件");
  6. JMenu editMenue = new JMenu( "编辑");
  7. JMenuItem auto = new JMenuItem( "自动换行");
  8. JMenuItem copy = new JMenuItem( "复制", new ImageIcon( "swing\\img\\component\\copy.png"));
  9. JMenuItem paste = new JMenuItem( "粘贴", new ImageIcon( "swing\\img\\component\\paste.png"));
  10. JMenu formatMenu = new JMenu( "格式");
  11. JMenuItem comment = new JMenuItem( "注释");
  12. JMenuItem cancelComment = new JMenuItem( "取消注释");
  13. //声明文本域
  14. JTextArea ta = new JTextArea( 8, 20);
  15. String[] colors= { "红色", "绿色", "蓝色"};
  16. //声明列表框
  17. JList<String> colorList = new JList<String>(colors);
  18. //声明选择相关组件
  19. JComboBox<String> colorSelect = new JComboBox<String>();
  20. ButtonGroup bg = new ButtonGroup(); //按钮组,实现单选效果
  21. JRadioButton male = new JRadioButton( "男", false);
  22. JRadioButton female = new JRadioButton( "女", true);
  23. JCheckBox isMarried = new JCheckBox( "是否已婚?", true);
  24. //声明底部
  25. JTextField tf = new JTextField( 40);
  26. JButton ok = new JButton( "确定", new ImageIcon( "swing\\img\\component\\ok.png"));
  27. //声明右键菜单
  28. JPopupMenu jPopupMenu = new JPopupMenu();
  29. ButtonGroup poupButtonBg = new ButtonGroup();
  30. JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem( "Metal 风格");
  31. JRadioButtonMenuItem nimbusItem = new JRadioButtonMenuItem( "Nimbus 风格");
  32. JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem( "Windows 风格", true);
  33. JRadioButtonMenuItem windowsClassicItem = new JRadioButtonMenuItem( "Windows 经典风格");
  34. JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem( "Motif 风格");
  35. //初始化界面
  36. public void init () {
  37. //组装视图
  38. //组装底部
  39. JPanel bottomPanel = new JPanel();
  40. bottomPanel.add(tf);
  41. bottomPanel.add(ok);
  42. f.add(bottomPanel, BorderLayout.SOUTH);
  43. //组装选择相关的组件
  44. JPanel selectPanel = new JPanel();
  45. colorSelect.addItem( "红色");
  46. colorSelect.addItem( "绿色");
  47. colorSelect.addItem( "蓝色");
  48. selectPanel.add(colorSelect);
  49. bg.add(male);
  50. bg.add(female);
  51. selectPanel.add(male);
  52. selectPanel.add(female);
  53. selectPanel.add(isMarried);
  54. //组装文本域和选择相关组件
  55. Box topLeft = Box.createVerticalBox();
  56. topLeft.add(ta);
  57. topLeft.add(selectPanel);
  58. //组装顶部
  59. Box top = Box.createHorizontalBox();
  60. top.add(topLeft);
  61. top.add(colorList);
  62. f.add(top);
  63. //组装顶部菜单
  64. formatMenu.add(comment);
  65. formatMenu.add(cancelComment);
  66. editMenue.add(auto);
  67. editMenue.addSeparator();
  68. editMenue.add(copy);
  69. editMenue.add(paste);
  70. editMenue.addSeparator();
  71. editMenue.add(formatMenu);
  72. menuBar.add(fileMenue);
  73. menuBar.add(editMenue);
  74. f.setJMenuBar(menuBar);
  75. //组装右键菜单
  76. poupButtonBg.add(metalItem);
  77. poupButtonBg.add(nimbusItem);
  78. poupButtonBg.add(windowsItem);
  79. poupButtonBg.add(windowsClassicItem);
  80. poupButtonBg.add(motifItem);
  81. ActionListener listener = new ActionListener() {
  82. @Override
  83. public void actionPerformed (ActionEvent e) {
  84. //当前选择的是哪一个风格
  85. String actionCommand = e.getActionCommand();
  86. try {
  87. changeFlavor(actionCommand);
  88. } catch (Exception ex) {
  89. ex.printStackTrace();
  90. }
  91. }
  92. };
  93. metalItem.addActionListener(listener);
  94. nimbusItem.addActionListener(listener);
  95. windowsItem.addActionListener(listener);
  96. windowsClassicItem.addActionListener(listener);
  97. motifItem.addActionListener(listener);
  98. jPopupMenu.add(metalItem);
  99. jPopupMenu.add(nimbusItem);
  100. jPopupMenu.add(windowsItem);
  101. jPopupMenu.add(windowsClassicItem);
  102. jPopupMenu.add(motifItem);
  103. //不需要再监听鼠标事件了
  104. ta.setComponentPopupMenu(jPopupMenu);
  105. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭程序
  106. f.pack();
  107. f.setVisible( true);
  108. }
  109. public static void main (String[] args) {
  110. new SwingComponentDemo().init();
  111. }
  112. //定义一个方法,用于改变界面风格
  113. private void changeFlavor (String command) throws Exception {
  114. switch (command) {
  115. case "Metal 风格":
  116. UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel");
  117. break;
  118. case "Nimbus 风格":
  119. UIManager.setLookAndFeel( "javax.swing.plaf.nimbus.NimbusLookAndFeel");
  120. break;
  121. case "Windows 风格":
  122. UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
  123. break;
  124. case "Windows 经典风格":
  125. UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
  126. break;
  127. case "Motif 风格":
  128. UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
  129. break;
  130. }
  131. //刷新组件的外观
  132. SwingUtilities.updateComponentTreeUI(f.getContentPane());
  133. SwingUtilities.updateComponentTreeUI(menuBar);
  134. SwingUtilities.updateComponentTreeUI(jPopupMenu);
  135. }
  136. }

 2.3 为组件设置边框

        很多情况下,我们常常喜欢给不同的组件设置边框,从而让界面的层次感更明显,Swing中提供了Border对象代表一个边框,下图是Border的一个继承体系图:

 特殊的Border:

        1.TitledBorder:它的作用并不是直接为其他组件添加边框,而是为其他边框设置标题,创建该类的对象时,需要传入一个其他的Border对象;

        2.CompoundBorder:用来组合其他两个边框,创建该类的对象时,需要传入其他两个Border对象,一个作为内边框,一个作为外边框。

给组件设置边框步骤:

        1.使用BorderFactory或者XxxBorder创建Border的实例对象;

        2.调用Swing组件的setBorder(Border b)方法为组件设置边框;

案例:

        使用Border实现下图效果:

 演示代码:


   
   
  1. public class BorderTest {
  2. JFrame jf = new JFrame( "测试边框");
  3. public void init(){
  4. / /组装视图
  5. / / 1.JFrame的布局修改为GridLayout
  6. jf.setLayout(new GridLayout( 2,4));
  7. / / 2.往网格中填充不同的JPanel组件,并且设置边框和内容
  8. / /创建BevelBorder
  9. Border bevelBorder = BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED, Color.GREEN, Color.BLUE, Color.GRAY);
  10. jf. add(getJPanelWithBorder(bevelBorder, "BevelBorder"));
  11. / /创建LineBorder
  12. Border lineBorder = BorderFactory.createLineBorder(Color.ORANGE, 10);
  13. jf. add(getJPanelWithBorder(lineBorder, "LineBorder"));
  14. / /创建EmptyBorder
  15. Border emptyBorder = BorderFactory.createEmptyBorder( 10, 5, 20, 10);
  16. jf. add(getJPanelWithBorder(emptyBorder, "EmptyBorder"));
  17. / /创建EchtedBorder
  18. Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.RED, Color.GREEN);
  19. jf. add(getJPanelWithBorder(etchedBorder, "EtchedBorder"));
  20. / /创建TitledBorder
  21. TitledBorder titledBorder = new TitledBorder(new LineBorder(Color.ORANGE, 10), "测试标题",TitledBorder. LEFT,TitledBorder. BOTTOM,new Font( "StSong",Font.BOLD, 18),Color.BLUE);
  22. jf. add(getJPanelWithBorder(titledBorder, "TitledBorder"));
  23. / /创建MatteBorder
  24. MatteBorder matteBorder = new MatteBorder( 10, 5, 20, 10, Color.GREEN);
  25. jf. add(getJPanelWithBorder(matteBorder, "MatteBorder"));
  26. / /创建CompoundBorder
  27. CompoundBorder compoundBorder = new CompoundBorder( new LineBorder(Color.RED, 10),titledBorder);
  28. jf. add(getJPanelWithBorder(compoundBorder, "CompoundBorder"));
  29. / / 3.设置窗口最佳大小、设置窗口可见,处理关闭操作
  30. jf.pack();
  31. jf.setVisible( true);
  32. jf.setDefaultCloseOperation(JFrame. EXIT_ ON_ CLOSE);
  33. }
  34. public JPanel getJPanelWithBorder(Border border, String content){
  35. JPanel jPanel = new JPanel();
  36. jPanel. add(new JLabel( content));
  37. / /设置边框
  38. jPanel.setBorder(border);
  39. return jPanel;
  40. }
  41. public static void main( String[] args) {
  42. new BorderTest().init();
  43. }
  44. }

2.4 使用JToolBar创建工具条

        Swing提供了JToolBar类来创建工具条,并且可以往JToolBar中添加多个工具按钮。

JToolBar API:

JToolBar(String name,

int orientation)

创建一个名字为name,方向为orientation的工具条对象
JButton add(Action a)通过Action对象为ToolBar工具条添加对应的工具按钮
addSeparator(Dimension size)向工具条中添加指定大小的分隔符
setFloatable(boolean b)设定工具条是否可以被拖动
setMargin(Insets m)设置工具条与工具按钮的边距
setOrientation(int o)设置工具条的方向

案例:

        使用JToolBar组件完成下图效果:

代码演示: 


   
   
  1. public class JToolBarTest {
  2. JFrame jf = new JFrame( "测试工具条");
  3. JTextArea jta = new JTextArea( 6, 35);
  4. //声明工具条相关内容
  5. JToolBar jToolBar = new JToolBar( "播放工具条",SwingConstants.HORIZONTAL);
  6. //创建3个Action对象
  7. //传递的参数,name和icon,最终在添加到工具条中时,会被拿出来作为按钮的名称和图标
  8. Action pre = new AbstractAction( "上一曲", new ImageIcon( "E:\\GUISwing\\img\\component\\上一曲16.png")) {
  9. @Override
  10. public void actionPerformed (ActionEvent e) {
  11. jta.append( "上一曲.\n");
  12. }
  13. };
  14. Action pause = new AbstractAction( "暂停", new ImageIcon( "E:\\GUISwing\\img\\component\\暂停16.png")) {
  15. @Override
  16. public void actionPerformed (ActionEvent e) {
  17. jta.append( "暂停播放.\n");
  18. }
  19. };
  20. Action next = new AbstractAction( "下一曲", new ImageIcon( "E:\\GUISwing\\img\\component\\下一曲16.png")) {
  21. @Override
  22. public void actionPerformed (ActionEvent e) {
  23. jta.append( "下一曲.\n");
  24. }
  25. };
  26. public void init (){
  27. //组装视图
  28. //通过Action对象来创建JButton
  29. JButton preBtn = new JButton(pre);
  30. JButton pauseBtn = new JButton(pause);
  31. JButton nextBtn = new JButton(next);
  32. /*jToolBar.add(pre);
  33. jToolBar.addSeparator();
  34. jToolBar.add(pause);
  35. jToolBar.addSeparator();
  36. jToolBar.add(next);*/
  37. jToolBar.add(preBtn);
  38. jToolBar.addSeparator();
  39. jToolBar.add(pauseBtn);
  40. jToolBar.addSeparator();
  41. jToolBar.add(nextBtn);
  42. //让工具条可以拖动
  43. jToolBar.setFloatable( true);
  44. jf.add(jToolBar,BorderLayout.NORTH);
  45. //文本框默认不支持滚动条
  46. //把一个组件设置到JScrollPane中,那么该组件就支持滚动条了
  47. JScrollPane jScrollPane = new JScrollPane(jta);
  48. jf.add(jScrollPane);
  49. jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  50. jf.pack();
  51. jf.setVisible( true);
  52. }
  53. public static void main (String[] args) {
  54. new JToolBarTest().init();
  55. }
  56. }

2.5 JColorChooser和JFileChooser

        Swing提供了JColorChooser和JFileChooser这两种对话框,可以很方便的完成颜色的选择和本地文件的选择。

JColorChooser

        JColorChooser用于创建颜色选择器对话框,该类的用法非常简单,只需要调用它的静态方法就可以快速生成一个颜色选择对话框:

public static Color showDialog(Component component,String title,Color initialColor)

/*       

        参数:

                Component:指定当前对话框的父组件

                title:当前对话框的名称

                initialColor:指定默认选中的颜色

        返回值:

                返回用户选中的颜色

*/

案例: 

        使用颜色选择器,完成下图功能:

                点击按钮,改变文本域的背景色

代码如下: 


   
   
  1. public class JColorChooserDemo {
  2. JFrame jFrame = new JFrame( "测试颜色选择器");
  3. JTextArea jta = new JTextArea( "我爱中华", 6, 30);
  4. //声明按钮
  5. JButton btn = new JButton( new AbstractAction( "改变文本框背景颜色") {
  6. @Override
  7. public void actionPerformed( ActionEvent e) {
  8. //弹出一个颜色选择器,
  9. Color result = JColorChooser. showDialog(jFrame, "颜色选择器", Color. white);
  10. //修改文本框背景
  11. jta. setBackground(result);
  12. }
  13. });
  14. public void init( ){
  15. //组装视图
  16. jFrame. add(jta);
  17. jFrame. add(btn, BorderLayout. SOUTH);
  18. jFrame. setDefaultCloseOperation( JFrame. EXIT_ON_CLOSE);
  19. jFrame. pack();
  20. jFrame. setVisible( true);
  21. }
  22. public static void main( String[] args) {
  23. new JColorChooserDemo(). init();
  24. }
  25. }
JFileChooser

        JFileChooser的功能与AWT中的FileDialog基本相同,也是用于生成“打开文件”、“保存文件”对话框。与FileDialog不同的是,JFileChooser无需依赖本地平台的GUI,它完全由Java实现,在所有平台上具有完全相同的行为,并可以在所有平台上具有相同的外观。

JFileChooser使用步骤:

        1.创建JfileChooser对象:

JFileChooser chooser=new JFileChooser("D:\\a");

        2. 调用JFileChooser的一系列可选方法,进行初始化:

setSelectedFile(File file)或setSelectedFiles(File[ ] selectedFiles);//设定默认选中的文件

setMultiSelectionEnabled(boolean b);设置是否允许多选,默认是单选

setFileSelectionMode(int mode);设置可选内容。默认只能选择文件 

         3.打开文件对话框

showOpenDialog(Component parent);打开文件加载对话框,并指定父组件

showSaveDialog(Component parent);打开文件保存对话框,并指定父组件

        4.获取用户选择的结果

File getSelectedFile();获取用户选择的一个文件

File[ ] getSelectedFiles();获取用户选择的多个文件 

 案例:

        使用JFileChooser完成打开和保存文件:

代码如下:


   
   
  1. public class JFileChooserDemo {
  2. //创建窗口对象
  3. JFrame jf = new JFrame( "测试JFileChooser");
  4. //创建菜单条
  5. JMenuBar jmb = new JMenuBar();
  6. //创建菜单
  7. JMenu jMenu = new JMenu( "文件");
  8. JMenuItem open = new JMenuItem( new AbstractAction( "打开") {
  9. @Override
  10. public void actionPerformed (ActionEvent e) {
  11. //显示一个文件选择器
  12. JFileChooser fileChooser = new JFileChooser( ".");
  13. fileChooser.showOpenDialog(jf);
  14. //获取用户选择的文件
  15. File file = fileChooser.getSelectedFile();
  16. //进行显示
  17. try {
  18. image = ImageIO.read(file);
  19. drawArea.repaint();
  20. } catch (IOException ex) {
  21. ex.printStackTrace();
  22. }
  23. }
  24. });
  25. JMenuItem save = new JMenuItem( new AbstractAction( "另存为") {
  26. @Override
  27. public void actionPerformed (ActionEvent e) {
  28. //显示一个文件选择器
  29. JFileChooser fileChooser = new JFileChooser( ".");
  30. fileChooser.showSaveDialog(jf);
  31. //获取用户选择的保存文件路径
  32. File file = fileChooser.getSelectedFile();
  33. try {
  34. ImageIO.write(image, "jpeg",file);
  35. } catch (IOException ex) {
  36. ex.printStackTrace();
  37. }
  38. }
  39. });
  40. BufferedImage image;
  41. //swing提供的组件,都使用了图像缓冲区技术
  42. private class MyCanvas extends JPanel{
  43. @Override
  44. public void paint (Graphics g) {
  45. //把图片绘制到组件上即可
  46. g.drawImage(image, 0, 0, null);
  47. }
  48. }
  49. MyCanvas drawArea = new MyCanvas();
  50. public void init (){
  51. //组装视图
  52. jMenu.add(open);
  53. jMenu.add(save);
  54. jmb.add(jMenu);
  55. jf.setJMenuBar(jmb);
  56. drawArea.setPreferredSize( new Dimension( 740, 500));
  57. jf.add(drawArea);
  58. //显示jf
  59. jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  60. jf.pack();
  61. jf.setVisible( true);
  62. }
  63. public static void main (String[] args) {
  64. new JFileChooserDemo().init();
  65. }
  66. }

2.6 JOptionPane

基本概述

        通过JOptionPane可以非常方便地创建一些简单的对话框,Swing已经为这些对话框添加了相应的组件,无需程序员手动添加组件。JOptionPane提供了如下4个方法来创建对话框。

showMessageDialog/showInternalMessageDialog

消息对话框,告知用户某事已发生,用户只能单击“确定”按钮。

showConfirmDialog/showInternalConfirmDialog确认对话框,向用户确定某个问题,用户可选yes,no-cancel等选项,该方法返回用户单击了哪个按钮
showInputDialog/showInternalInputDialog输入对话框,提示输入某些信息。该方法返回用户输入的字符串
showOptionDialog/showInternalOptionDialog自定义选项对话框,允许使用自定义选项

上述方法都有很多重载形式,选择其中一种最全的形式,参数解释如下:

showXxxDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon,Object[] options,Object initialValue)

参数解释:

parentComponent:当前对话框的父组件

message:对话框上显示的信息,可以是字符串、组件、图片等

title:当前对话框标题

optionType:当前对话框上显示的按钮类型:DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION

messageType:当前对话框的类型:ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE

icon:当前对话框左上角图标

options:自定义下拉列表的选项

initialValue:自定义选项中的默认选中项

 下面演示四种对话框:


消息对话框:


   
   
  1. public class MessageDialogTest {
  2. JFrame jf = new JFrame( "测试消息对话框");
  3. JTextArea jta = new JTextArea( 6, 30);
  4. / /声明按钮
  5. JButton btn = new JButton(new AbstractAction( "弹出消息对话框") {
  6. @ Override
  7. public void actionPerformed(ActionEvent e) {
  8. / /弹出一个消息对话框,并且显示 文本域中输入的内容
  9. String text = jta.getText();
  10. / /参数:int messageType 指定消息对话框的类型: 错误消息,警告消息,问题消息...
  11. / /JOptionPane.showMessageDialog(jf,text, "消息对话框",JOptionPane. ERROR_MESSAGE);
  12. / /JOptionPane.showMessageDialog(jf,text, "消息对话框",JOptionPane.INFORMATION_MESSAGE);
  13. / /JOptionPane.showMessageDialog(jf,text, "消息对话框",JOptionPane.WARNING_MESSAGE);
  14. / /JOptionPane.showMessageDialog(jf,text, "消息对话框",JOptionPane.QUESTION_MESSAGE);
  15. / /JOptionPane.showMessageDialog(jf,text, "消息对话框",JOptionPane.PLAIN_MESSAGE);
  16. JOptionPane.showMessageDialog(jf,text, "消息对话框",JOptionPane.WARNING_MESSAGE,new ImageIcon( "E:\\GUISwing\\img\\component\\female.png"));
  17. }
  18. });
  19. public void init(){
  20. / /组装视图
  21. jf. add(jta);
  22. jf. add(btn,BorderLayout.SOUTH);
  23. jf.setDefaultCloseOperation(JFrame. EXIT_ ON_ CLOSE);
  24. jf.pack();
  25. jf.setVisible( true);
  26. }
  27. public static void main( String[] args) {
  28. new MessageDialogTest().init();
  29. }
  30. }
确认对话框:


   
   
  1. public class ConfirmDialogTest {
  2. JFrame jf = new JFrame( "测试确认对话框");
  3. JTextArea jta = new JTextArea( 6, 30);
  4. JButton btn = new JButton(new AbstractAction( "弹出确认对话框") {
  5. @ Override
  6. public void actionPerformed(ActionEvent e) {
  7. / /TODO 弹出确认对话框
  8. String text = jta.getText();
  9. jta.append( "\n");
  10. / /int result = JOptionPane.showConfirmDialog(jf, text, "确认对话框", JOptionPane. DEFAULT_OPTION);
  11. / /int result = JOptionPane.showConfirmDialog(jf, text, "确认对话框", JOptionPane.YES_ NO_OPTION);
  12. int result = JOptionPane.showConfirmDialog(jf, text, "确认对话框", JOptionPane.YES_ NO_ CANCEL_OPTION);
  13. / /int result = JOptionPane.showConfirmDialog(jf, text, "确认对话框", JOptionPane.OK_ CANCEL_OPTION);
  14. if (result = = JOptionPane.YES_OPTION){
  15. jta.append( "用户点击了 是 按钮\n");
  16. }
  17. if (result = = JOptionPane. NO_OPTION){
  18. jta.append( "用户点击了 否 按钮\n");
  19. }
  20. / * if (result = = JOptionPane.OK_OPTION){
  21. jta.append( "用户点击了 确认 按钮\n");
  22. } * /
  23. if (result = = JOptionPane. CANCEL_OPTION){
  24. jta.append( "用户点击了 取消 按钮\n");
  25. }
  26. }
  27. });
  28. public void init(){
  29. jf. add(jta);
  30. jf. add(btn, BorderLayout.SOUTH);
  31. jf.setDefaultCloseOperation(JFrame. EXIT_ ON_ CLOSE);
  32. jf.pack();
  33. jf.setVisible( true);
  34. }
  35. public static void main( String[] args) {
  36. new ConfirmDialogTest().init();
  37. }
  38. }
输入对话框:


   
   
  1. public class InputDialogTest {
  2. JFrame jf = new JFrame( "测试输入对话框");
  3. JTextArea jta = new JTextArea( 6, 30);
  4. JButton btn = new JButton( new AbstractAction( "弹出输入对话框") {
  5. @Override
  6. public void actionPerformed( ActionEvent e) {
  7. //弹出输入对话框
  8. String result = JOptionPane. showInputDialog(jf, "请填写您的银行账号:", "输入对话框", JOptionPane. INFORMATION_MESSAGE);
  9. jta. append(result);
  10. }
  11. });
  12. public void init( ){
  13. jf. add(jta);
  14. jf. add(btn, BorderLayout. SOUTH);
  15. jf. setDefaultCloseOperation( JFrame. EXIT_ON_CLOSE);
  16. jf. pack();
  17. jf. setVisible( true);
  18. }
  19. public static void main( String[] args) {
  20. new InputDialogTest(). init();
  21. }
  22. }
选项对话框:


   
   
  1. public class OptionDialogTest {
  2. JFrame jf = new JFrame( "测试选项对话框");
  3. JTextArea jta = new JTextArea( 6, 30);
  4. JButton btn = new JButton( new AbstractAction( "弹出选项对话框") {
  5. @Override
  6. public void actionPerformed( ActionEvent e) {
  7. //弹出选项对话框
  8. int result = JOptionPane. showOptionDialog(jf, "请选择你的登录账号", "选项对话框", JOptionPane. DEFAULT_OPTION,
  9. JOptionPane. INFORMATION_MESSAGE, null, new String[]{ "大号", "中号", "小号"}, "中号");
  10. switch (result){
  11. case 0:
  12. jta. setText( "用户选择了大号");
  13. break;
  14. case 1:
  15. jta. setText( "用户选择了中号");
  16. break;
  17. case 2:
  18. jta. setText( "用户选择了小号");
  19. break;
  20. }
  21. }
  22. });
  23. public void init( ){
  24. jf. add(jta);
  25. jf. add(btn, BorderLayout. SOUTH);
  26. jf. setDefaultCloseOperation( JFrame. EXIT_ON_CLOSE);
  27. jf. pack();
  28. jf. setVisible( true);
  29. }
  30. public static void main( String[] args) {
  31. new OptionDialogTest(). init();
  32. }
  33. }

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java核心技术》出版以来一直畅销不衰,深受读者青睐,每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新改写了部分内容,以便适应Java的最新特性。本版也不例外,它反映了Java SE 6的新特性。全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理、Swing用户界面组件、部署应用程序和Applet、异常日志断言和调试、泛型程序设计、集合以及多线程等内容。. 全书对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例,从而帮助读者充分理解Java语言以及Java类库的相关特性。对于想将Java应用于实际项目中的程序员来说,《Java核心技术——基础知识》修订版是一本权威性的指导书籍。对于Java SE 6平台的全部更新,这本实用的教程和可靠的参考书通过大量测试过的示例说明了最重要的语言特性和类库特性。示例程序经过精心地设计,不但具有实用价值,而且易读、易理解,可以作为自己编写程序的良好开端。.. 卷I试图让读者快速地了解Java SE 6的新特性,并帮助有效地从Java早期版本升级到最新版本,或从一种其他的语言变换为使用Java语言。作者十分注重Java语言的基本概念以及用户界面程序设计基础。下面是本卷详细介绍的主要内容: Java语言基础知识面向对象程序设计接口与内部类事件监听器模型 Swing图形用户界面程序设计打包应用程序异常处理登陆与调试泛型化程序设计集合框架多线程... 【作译者介绍】 本书提供作译者介绍 Cay S. Horstmann参与编写《Core JavaServer Faces》第2版(Prentice Hall, 2007)。Cay是圣何塞州立大学计算机科学系教授、Java的倡导者,并经常在计算机会议上讲演。. Cray Cornell已经编写并教授程序设计专业课程20余年,是Apress的创始人。他撰写的程序设计专业书籍十分畅销,是Jolt Award的最终获奖者之一,并通过Visual Basic资料赢得了Readers Choice。...
看到很多人都分卷打包的,下载很是不方便,还浪费积分,我就整合压缩打包到一个包里面,里面包含全部源码 源码目录如下: 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门样例demo 第2部分(3个程序包) javasyntax.zip 05.Java核心语法详解 javaoop.zip 06.Java面向对象编程(计算器) javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16.AWT图形界面开发——Java文本编辑器 javamedia.zip 17.AWT多媒体编程——录音机、MP3播放器、视频拍照、视频播放器 javaswing.zip 18.Swing图形界面开发——Java文本编辑器 javaswt.zip 19.SWT图形界面开发——Java文本编辑器 javajface.zip 20.SWT增强组件库JFace 第5部分(5个程序包) javaapplet.zip 21.Applet网络组件——电子相册 javanet.zip 22.Java网络编程详解(Socket/UDP实例、简单聊天系统) javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
完整全套资源下载地址:https://download.csdn.net/download/qq_27595745/71331017 【完整课程列表】 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_01 Java概述与应用 Eclipse 集成环境使用 (共16页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_01 Java概述与应用 Eclipse+MyEclipse+Tomcat安装(第1章) (共20页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_01 Java概述与应用 JAVA_01Java概述与应用 (共89页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_01 Java概述与应用 前言 学习java前的准备工作 (共4页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_02 面向对象(OO)程序设计概念 (共51页).PPT 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_03 JAVA语言基础 位运算(共21页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_03 JAVA语言基础(共57页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_04 Java面向对象特性(共41页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_05 高级语言特征(共65页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_06 异常处理Exceptions(共31页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_07 IO输入输出(共30页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_08 AWT图形界面编程 JFC AWT Swing(共56页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_08 AWT图形界面编程 JFC Swing (共22页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_09 Applet (共33页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_10 线程(共51页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_11 网络程序设计(共26页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_12 JFC Swing (共20页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_13 JDBC(共15页).ppt 完整版 杭州电子科技大学JAVA语言程序设计 JAVA_13 JDBC编程(共31页).ppt JAVA_01Java概述与应用\God.java JAVA_01Java概述与应用\Human.java JAVA_01Java概述与应用\javaapplet.html JAVA_01Java概述与应用\WelcomeJava.java JAVA_01Java概述与应用\WelcomeJavaApplet.java JAVA_10线程\第十章上机练习题.doc JAVA_11网络程序设计\第11章上机练习题.doc JAVA_11网络程序设计\邮件发送源码.rar JAVA_12 Swing\SwingTest.java JAVA_13 JDBC\Connec.java JAVA_13 JDBC\mysql-5.5.11-win32(1).msi JAVA_13 JDBC\SQLyog832Trial.exe JAVA_13 JDBC\SQLyog832Trial.zip JAVA_13 JDBC\实训项目——Java电子小字典.doc JAVA_2面向对象(OO)程序设计概念\Animal(Polymorphism).java JAVA_2面向对象(OO)程序设计概念\Animal(super).java JAVA_2面向对象(OO)程序设计概念\Animal.class JAVA_2面向对象(OO)程序设计概念\Animal.java JAVA_2面向对象(OO)程序设计概念\Fish.class JAVA_2面向对象(OO)程序设计概念\Integration.class JAVA_2面向对象(OO)程序设计概念\Point.java JAVA_2面向对象(OO)程序设计概念\第二章上机练习题.doc JAVA_3JAVA语言基础\StringTest.java JAVA_3JAVA语言基础\Test.java JAVA_3JAVA语言基础\Welcome.java JAVA_3JAVA语言基础\第三章上机练习题.doc JAVA_4Java面向对象特性\Animal(Poly

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值