Java Swing组件在GUI编程中的应用有哪些?

2026-05-06 04:261阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3642个文字,预计阅读时间需要15分钟。

Java Swing组件在GUI编程中的应用有哪些?

目录:为组件设置边框 + 使用JToolBar创建工具条 + JColorChooser和JFileChooser + JColorChooser + JFileChooser + JOptionPane + 基本概述 + 四种对话框演示 + 为组件设置边框 + 多种情况下,我们常喜欢给不同组件设置边框

目录
  • 为组件设置边框
  • 使用JToolBar创建工具条
  • JColorChooser和JFileChooser
  • JColorChooser
  • JFileChooser
  • JOptionPane
  • 基本概述
  • 四种对话框演示

为组件设置边框

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


特殊的Border:

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

给组件设置边框步骤:

  1. 使用BorderFactory或者XxxBorder创建Border的实例对象;
  2. 调用Swing组件的setBorder(Border b)方法为组件设置边框;

案例:

​ 请使用Border实现下图效果:


演示代码:

import javax.swing.*; import javax.swing.border.*; import java.awt.*; public class BorderTest { JFrame jf = new JFrame("测试边框"); public void init(){ //设置Jframe为网格布局 jf.setLayout(new GridLayout(2,4)); //创建凸起的斜边框,分别设置四条边的颜色 Border bb = BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.RED,Color.GREEN,Color.BLUE,Color.GRAY); jf.add(getPanelWithBorder(bb,"BevelBorder")); //创建LineBorder Border lb = BorderFactory.createLineBorder(Color.ORANGE, 10); jf.add(getPanelWithBorder(lb,"LineBorder")); //创建EmptyBorder,会在组件的四周留白 Border eb = BorderFactory.createEmptyBorder(20, 5, 10, 30); jf.add(getPanelWithBorder(eb,"EmptyBorder")); //创建EtchedBorder, Border etb = BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.RED, Color.GREEN); jf.add(getPanelWithBorder(etb,"EtchedBorder")); //创建TitledBorder,为原有的Border添加标题 TitledBorder tb = new TitledBorder(lb,"测试标题",TitledBorder.LEFT,TitledBorder.BOTTOM,new Font("StSong",Font.BOLD,18),Color.BLUE); jf.add(getPanelWithBorder(tb,"TitledBorder")); //直接创建MatteBorder,它是EmptyBorder的子类,EmptyBorder是留白,而MatteBorder可以给留空的区域填充颜色 MatteBorder mb = new MatteBorder(20,5,10,30,Color.GREEN); jf.add(getPanelWithBorder(mb,"MatteBorder")); //直接创创建CompoundBorder,将两个边框组合成新边框 CompoundBorder cb = new CompoundBorder(new LineBorder(Color.RED,8),tb); jf.add(getPanelWithBorder(cb,"CompoundBorder")); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public JPanel getPanelWithBorder(Border border,String borderName){ JPanel jPanel = new JPanel(); jPanel.add(new JLabel(borderName)); //为panel设置边框 jPanel.setBorder(border); return jPanel; } public static void main(String[] args) { new BorderTest().init(); } } 使用JToolBar创建工具条

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

JToolBar API:

方法名称 方法功能 JToolBar( String name , int orientation) 创建一个名字为name,方向为orientation的工具条对象,其orientation的是取值可以是SwingConstants.HORIZONTAL或SwingConstants.VERTICAL JButton add(Action a) 通过Action对象为JToolBar工具条添加对应的工具按钮 addSeparator( Dimension size ) 向工具条中添加指定大小的分隔符 setFloatable( boolean b ) 设定工具条是否可以被拖动 setMargin(Insets m) 设置工具条与工具按钮的边距 setOrientation( int o ) 设置工具条的方向 setRollover(boolean rollover) 设置此工具条的rollover状态

add(Action a)方法:

​ 上述API中add(Action a)这个方法比较难理解,为什么呢,之前说过,Action接口是ActionListener的一个子接口,那么它就代表一个事件监听器,而这里add方法是在给工具条添加一个工具按钮,为什么传递的是一个事件监听器呢?

​ 首先要明确的是不管是菜单条中的菜单项还是工具条中的工具按钮,最终肯定是需要点击来完成一些操作,所以JToolBar以及JMenu都提供了更加便捷的添加子组件的方法add(Action a),在这个方法的内部会做如下几件事:

  1. 创建一个适用于该容器的组件(例如,在工具栏中创建一个工具按钮);
  2. 从 Action 对象中获得对应的属性来设置该组件(例如,通过 name 来设置文本,通过 lcon 来设置图标) ;
  3. 把Action监听器注册到刚才创建的组件上;

案例:

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

演示代码:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class JToolBarTest { JFrame jf = new JFrame("测试工具条"); JTextArea jta = new JTextArea(6, 35); // 创建工具条 JToolBar jtb = new JToolBar(); // 创建"上一曲"Action,该Action用于创建工具按钮 Action pre = new AbstractAction("上一曲", new ImageIcon("D:\\files\\Java-GUI\\src\\layout\\pre.png")) { @Override public void actionPerformed(ActionEvent e) { jta.append("上一曲.\n"); } }; // 创建"暂停" Action Action pause = new AbstractAction("暂停", new ImageIcon("D:\\files\\Java-GUI\\src\\layout\\pause.png")) { @Override public void actionPerformed(ActionEvent e) { jta.append("暂停播放.\n"); } }; // 创建"下一曲" Action Action next = new AbstractAction("下一曲", new ImageIcon("D:\\files\\Java-GUI\\src\\layout\\next.png")) { @Override public void actionPerformed(ActionEvent e) { jta.append("下一曲.\n"); } }; public void init() { // 给JTextArea添加滚动条 jf.add(new JScrollPane(jta)); // 以Action的形式创建按钮,并将按钮添加到Panel中 JButton preBtn = new JButton(pre); JButton pauseBtn = new JButton(pause); JButton nextBtn = new JButton(next); // 往工具条中添加Action对象,该对象会转换成工具按钮 jtb.add(preBtn); jtb.addSeparator(); jtb.add(pauseBtn); jtb.addSeparator(); jtb.add(nextBtn); // 向窗口中添加工具条 jf.add(jtb, BorderLayout.NORTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new JToolBarTest().init(); } } JColorChooser和JFileChooser

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

JColorChooser

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

public static Color showDialog(Component component, String title,Color initialColor) /* 参数: componet:指定当前对话框的父组件 title:当前对话框的名称 initialColor:指定默认选中的颜色 返回值: 返回用户选中的颜色 */

案例:

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

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

演示代码:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class JColorChooserDemo { JFrame jFrame = new JFrame("测试颜色选择器"); JTextArea jta = new JTextArea("快关注我",6,30); JButton button = new JButton(new AbstractAction("改变文本框的本景色"){ @Override public void actionPerformed(ActionEvent e) { //弹出颜色选择器 Color result = JColorChooser.showDialog(jFrame, "颜色选择器", Color.WHITE); jta.setBackground(result); } }); public void init(){ jFrame.add(jta); jFrame.add(button,BorderLayout.SOUTH); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame.pack(); jFrame.setVisible(true); } public static void main(String[] args) { new JColorChooserDemo().init(); } } JFileChooser

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

JFileChooser使用步骤:

  1. 创建JFileChooser对象:

JFileChooser chooser = new JFileChooser("D:\\a");//指定默认打开的本地磁盘路径

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

setSelectedFile(File file)/setSelectedFiles(File[] selectedFiles):设定默认选中的文件 setMultiSelectionEnabled(boolean b):设置是否允许多选,默认是单选 setFileSelectionMode(int mode):设置可以选择内容,例如文件、文件夹等,默认只能选择文件

  1. 打开文件对话框

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

  1. 获取用户选择的结果

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

案例:

​ 使用JFileChooser完成下图效果:

演示代码:

import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class JFileChooserDemo { //创建窗口对象 JFrame jf = new JFrame("测试JFileChooser"); //创建打开文件对话框 JFileChooser chooser = new JFileChooser("."); //创建菜单条 JMenuBar jmb = new JMenuBar(); //创建菜单 JMenu jMenu = new JMenu("文件"); //创建菜单项 JMenuItem open = new JMenuItem(new AbstractAction("打开"){ @Override public void actionPerformed(ActionEvent e) { chooser.showOpenDialog(jf); File imageFile = chooser.getSelectedFile(); try { image = ImageIO.read(imageFile); drawArea.repaint(); } catch (IOException e1) { e1.printStackTrace(); } } }); JMenuItem save = new JMenuItem(new AbstractAction("另存为"){ @Override public void actionPerformed(ActionEvent e) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.showSaveDialog(jf); File dir = chooser.getSelectedFile(); try { ImageIO.write(image,"jpeg",new File(dir,"a.jpg")); } catch (Exception e1) { e1.printStackTrace(); } } }); //用来记录用户选择的图片 BufferedImage image; //显示图片 class MyCanvas extends JPanel{ @Override public void paint(Graphics g) { if (image!=null){ g.drawImage(image,0,0,null); } } } JPanel drawArea = new MyCanvas(); public void init(){ //设置图片显示区域大小 drawArea.setPreferredSize(new Dimension(500,300)); jf.add(drawArea); //组装并设置菜单条 jMenu.add(open); jMenu.add(save); jmb.add(jMenu); jf.setJMenuBar(jmb); //显示jf jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new JFileChooserDemo().init(); } } JOptionPane 基本概述

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

方法名称 方法功能 showMessageDialog/showInternalMessageDialog 消息对话框 ,告知用户某事己发生 , 用户只能单击"确定"按钮 , 类似于 JavaScript 的 alert 函数 。 showConfirmDialog/showInternalConfirmDialog 确认对话框,向用户确认某个问题,用户可以选择 yes 、 no ~ cancel 等选项 。 类似于 JavaScript 的 comfirm 函数 。该方法返回用户单击了 哪个按钮 showInputDialog/showInternalInputDialog 输入对话框,提示要求输入某些信息,类似于 JavaScript的 prompt 函数。该方法返回用户输入的字符串 。 showOptionDialog/showInternalOptionDialog 自定义选项对话框 ,允许使用自 定义选项 ,可以取代showConfirmDialog 所产生的对话框,只是用起来更复杂 。

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

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:自定义选项中的默认选中项

当用户与对话框交互结束后,不同类型对话框的返回值如下:

  • showMessageDialog: 无返回值 。
  • showlnputDialog: 返回用户输入或选择的字符串 。
  • showConfirmDialog: 返回 一个整数代表用户选择的选项 。
  • showOptionDialog : 返回 一个整数代表用户选择的选项,如果用户选择第一项,则返回 0; 如果选择第二项,则返回1……依此类推 。

对 showConfirmDialog 所产生的对话框,有如下几个返回值:

  • YES OPTION: 用户 单击了 "是"按钮后返回 。
  • NO OPTION: 用 户单击了"否"按钮后返回 。
  • CANCEL OPTION: 用户单击了"取消"按钮后返回 。
  • OK OPTION : 用户单击了"确定"按钮后返回 。
  • CLOSED OPTION: 用户 单击了对话框右上角的 " x" 按钮后返回。
四种对话框演示

消息对话框:

import cn.itcast.swing.util.ImagePathUtil; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class MessageDialogTest { JFrame jf = new JFrame("测试消息对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出消息对话框") { @Override public void actionPerformed(ActionEvent e) { //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.ERROR_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.INFORMATION_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.WARNING_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.QUESTION_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.PLAIN_MESSAGE); JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.WARNING_MESSAGE, new ImageIcon(ImagePathUtil.getRealPath("2\\female.png"))); } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new MessageDialogTest().init(); } }

确认对话框:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class ConfirmDialogTest { JFrame jf = new JFrame("测试确认对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出确认对话框") { @Override public void actionPerformed(ActionEvent e) { int result = JOptionPane.showConfirmDialog(jf, jta.getText(), "确认对话框",JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (result == JOptionPane.YES_OPTION){ jta.append("\n用户点击了确定按钮"); } if (result==JOptionPane.NO_OPTION){ jta.append("\n用户点击了取消按钮"); } } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new ConfirmDialogTest().init(); } }

输入对话框:


import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class InputDialogTest { JFrame jf = new JFrame("测试输入对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出输入对话框") { @Override public void actionPerformed(ActionEvent e) { /* String result = JOptionPane.showInputDialog(jf, "请填写您的银行账号:", "输入对话框", JOptionPane.INFORMATION_MESSAGE); if(result!=null){ jta.append(result.toString()); } */ Object result = JOptionPane.showInputDialog(jf, "", "输入对话框", JOptionPane.DEFAULT_OPTION, null, new String[]{"柳岩", "舒淇", "龚玥菲"}, "舒淇"); if (result!=null){ jta.append(result.toString()); } } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new InputDialogTest().init(); } }

选项对话框:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class OptionDialogTest { JFrame jf = new JFrame("测试选项对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出选项对话框") { @Override public void actionPerformed(ActionEvent e) { int result = JOptionPane.showOptionDialog(jf, "请选择尿不湿号码", "选项对话框",JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null,new String[]{"大号","中号","小号"},"中号"); switch (result){ case 0: jta.setText("用户选择了大号"); break; case 1: jta.setText("用户选择了中号"); break; case 2: jta.setText("用户选择了小号"); break; } } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new OptionDialogTest().init(); } }

如图片失效等影响浏览文章可参阅公众号文章:

Java Swing组件在GUI编程中的应用有哪些?

  • 为组件设置边框:mp.weixin.qq.com/s/En67fcV9-IiO9V-jXL39sQ
  • 使用JToolBar创建工具条:mp.weixin.qq.com/s/IDnY_szKCG80mBR3zAzlmg
  • JColorChooser和JFileChooser:mp.weixin.qq.com/s/dvoUYVCh8GaIuXPwxZ5Cfg
  • JOptionPane:mp.weixin.qq.com/s/-XOLiMjRY0YgmkrSqHqDGA
欢迎关注我的公众号,共同学习

本文共计3642个文字,预计阅读时间需要15分钟。

Java Swing组件在GUI编程中的应用有哪些?

目录:为组件设置边框 + 使用JToolBar创建工具条 + JColorChooser和JFileChooser + JColorChooser + JFileChooser + JOptionPane + 基本概述 + 四种对话框演示 + 为组件设置边框 + 多种情况下,我们常喜欢给不同组件设置边框

目录
  • 为组件设置边框
  • 使用JToolBar创建工具条
  • JColorChooser和JFileChooser
  • JColorChooser
  • JFileChooser
  • JOptionPane
  • 基本概述
  • 四种对话框演示

为组件设置边框

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


特殊的Border:

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

给组件设置边框步骤:

  1. 使用BorderFactory或者XxxBorder创建Border的实例对象;
  2. 调用Swing组件的setBorder(Border b)方法为组件设置边框;

案例:

​ 请使用Border实现下图效果:


演示代码:

import javax.swing.*; import javax.swing.border.*; import java.awt.*; public class BorderTest { JFrame jf = new JFrame("测试边框"); public void init(){ //设置Jframe为网格布局 jf.setLayout(new GridLayout(2,4)); //创建凸起的斜边框,分别设置四条边的颜色 Border bb = BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.RED,Color.GREEN,Color.BLUE,Color.GRAY); jf.add(getPanelWithBorder(bb,"BevelBorder")); //创建LineBorder Border lb = BorderFactory.createLineBorder(Color.ORANGE, 10); jf.add(getPanelWithBorder(lb,"LineBorder")); //创建EmptyBorder,会在组件的四周留白 Border eb = BorderFactory.createEmptyBorder(20, 5, 10, 30); jf.add(getPanelWithBorder(eb,"EmptyBorder")); //创建EtchedBorder, Border etb = BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.RED, Color.GREEN); jf.add(getPanelWithBorder(etb,"EtchedBorder")); //创建TitledBorder,为原有的Border添加标题 TitledBorder tb = new TitledBorder(lb,"测试标题",TitledBorder.LEFT,TitledBorder.BOTTOM,new Font("StSong",Font.BOLD,18),Color.BLUE); jf.add(getPanelWithBorder(tb,"TitledBorder")); //直接创建MatteBorder,它是EmptyBorder的子类,EmptyBorder是留白,而MatteBorder可以给留空的区域填充颜色 MatteBorder mb = new MatteBorder(20,5,10,30,Color.GREEN); jf.add(getPanelWithBorder(mb,"MatteBorder")); //直接创创建CompoundBorder,将两个边框组合成新边框 CompoundBorder cb = new CompoundBorder(new LineBorder(Color.RED,8),tb); jf.add(getPanelWithBorder(cb,"CompoundBorder")); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public JPanel getPanelWithBorder(Border border,String borderName){ JPanel jPanel = new JPanel(); jPanel.add(new JLabel(borderName)); //为panel设置边框 jPanel.setBorder(border); return jPanel; } public static void main(String[] args) { new BorderTest().init(); } } 使用JToolBar创建工具条

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

JToolBar API:

方法名称 方法功能 JToolBar( String name , int orientation) 创建一个名字为name,方向为orientation的工具条对象,其orientation的是取值可以是SwingConstants.HORIZONTAL或SwingConstants.VERTICAL JButton add(Action a) 通过Action对象为JToolBar工具条添加对应的工具按钮 addSeparator( Dimension size ) 向工具条中添加指定大小的分隔符 setFloatable( boolean b ) 设定工具条是否可以被拖动 setMargin(Insets m) 设置工具条与工具按钮的边距 setOrientation( int o ) 设置工具条的方向 setRollover(boolean rollover) 设置此工具条的rollover状态

add(Action a)方法:

​ 上述API中add(Action a)这个方法比较难理解,为什么呢,之前说过,Action接口是ActionListener的一个子接口,那么它就代表一个事件监听器,而这里add方法是在给工具条添加一个工具按钮,为什么传递的是一个事件监听器呢?

​ 首先要明确的是不管是菜单条中的菜单项还是工具条中的工具按钮,最终肯定是需要点击来完成一些操作,所以JToolBar以及JMenu都提供了更加便捷的添加子组件的方法add(Action a),在这个方法的内部会做如下几件事:

  1. 创建一个适用于该容器的组件(例如,在工具栏中创建一个工具按钮);
  2. 从 Action 对象中获得对应的属性来设置该组件(例如,通过 name 来设置文本,通过 lcon 来设置图标) ;
  3. 把Action监听器注册到刚才创建的组件上;

案例:

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

演示代码:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class JToolBarTest { JFrame jf = new JFrame("测试工具条"); JTextArea jta = new JTextArea(6, 35); // 创建工具条 JToolBar jtb = new JToolBar(); // 创建"上一曲"Action,该Action用于创建工具按钮 Action pre = new AbstractAction("上一曲", new ImageIcon("D:\\files\\Java-GUI\\src\\layout\\pre.png")) { @Override public void actionPerformed(ActionEvent e) { jta.append("上一曲.\n"); } }; // 创建"暂停" Action Action pause = new AbstractAction("暂停", new ImageIcon("D:\\files\\Java-GUI\\src\\layout\\pause.png")) { @Override public void actionPerformed(ActionEvent e) { jta.append("暂停播放.\n"); } }; // 创建"下一曲" Action Action next = new AbstractAction("下一曲", new ImageIcon("D:\\files\\Java-GUI\\src\\layout\\next.png")) { @Override public void actionPerformed(ActionEvent e) { jta.append("下一曲.\n"); } }; public void init() { // 给JTextArea添加滚动条 jf.add(new JScrollPane(jta)); // 以Action的形式创建按钮,并将按钮添加到Panel中 JButton preBtn = new JButton(pre); JButton pauseBtn = new JButton(pause); JButton nextBtn = new JButton(next); // 往工具条中添加Action对象,该对象会转换成工具按钮 jtb.add(preBtn); jtb.addSeparator(); jtb.add(pauseBtn); jtb.addSeparator(); jtb.add(nextBtn); // 向窗口中添加工具条 jf.add(jtb, BorderLayout.NORTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new JToolBarTest().init(); } } JColorChooser和JFileChooser

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

JColorChooser

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

public static Color showDialog(Component component, String title,Color initialColor) /* 参数: componet:指定当前对话框的父组件 title:当前对话框的名称 initialColor:指定默认选中的颜色 返回值: 返回用户选中的颜色 */

案例:

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

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

演示代码:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class JColorChooserDemo { JFrame jFrame = new JFrame("测试颜色选择器"); JTextArea jta = new JTextArea("快关注我",6,30); JButton button = new JButton(new AbstractAction("改变文本框的本景色"){ @Override public void actionPerformed(ActionEvent e) { //弹出颜色选择器 Color result = JColorChooser.showDialog(jFrame, "颜色选择器", Color.WHITE); jta.setBackground(result); } }); public void init(){ jFrame.add(jta); jFrame.add(button,BorderLayout.SOUTH); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame.pack(); jFrame.setVisible(true); } public static void main(String[] args) { new JColorChooserDemo().init(); } } JFileChooser

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

JFileChooser使用步骤:

  1. 创建JFileChooser对象:

JFileChooser chooser = new JFileChooser("D:\\a");//指定默认打开的本地磁盘路径

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

setSelectedFile(File file)/setSelectedFiles(File[] selectedFiles):设定默认选中的文件 setMultiSelectionEnabled(boolean b):设置是否允许多选,默认是单选 setFileSelectionMode(int mode):设置可以选择内容,例如文件、文件夹等,默认只能选择文件

  1. 打开文件对话框

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

  1. 获取用户选择的结果

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

案例:

​ 使用JFileChooser完成下图效果:

演示代码:

import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class JFileChooserDemo { //创建窗口对象 JFrame jf = new JFrame("测试JFileChooser"); //创建打开文件对话框 JFileChooser chooser = new JFileChooser("."); //创建菜单条 JMenuBar jmb = new JMenuBar(); //创建菜单 JMenu jMenu = new JMenu("文件"); //创建菜单项 JMenuItem open = new JMenuItem(new AbstractAction("打开"){ @Override public void actionPerformed(ActionEvent e) { chooser.showOpenDialog(jf); File imageFile = chooser.getSelectedFile(); try { image = ImageIO.read(imageFile); drawArea.repaint(); } catch (IOException e1) { e1.printStackTrace(); } } }); JMenuItem save = new JMenuItem(new AbstractAction("另存为"){ @Override public void actionPerformed(ActionEvent e) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.showSaveDialog(jf); File dir = chooser.getSelectedFile(); try { ImageIO.write(image,"jpeg",new File(dir,"a.jpg")); } catch (Exception e1) { e1.printStackTrace(); } } }); //用来记录用户选择的图片 BufferedImage image; //显示图片 class MyCanvas extends JPanel{ @Override public void paint(Graphics g) { if (image!=null){ g.drawImage(image,0,0,null); } } } JPanel drawArea = new MyCanvas(); public void init(){ //设置图片显示区域大小 drawArea.setPreferredSize(new Dimension(500,300)); jf.add(drawArea); //组装并设置菜单条 jMenu.add(open); jMenu.add(save); jmb.add(jMenu); jf.setJMenuBar(jmb); //显示jf jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new JFileChooserDemo().init(); } } JOptionPane 基本概述

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

方法名称 方法功能 showMessageDialog/showInternalMessageDialog 消息对话框 ,告知用户某事己发生 , 用户只能单击"确定"按钮 , 类似于 JavaScript 的 alert 函数 。 showConfirmDialog/showInternalConfirmDialog 确认对话框,向用户确认某个问题,用户可以选择 yes 、 no ~ cancel 等选项 。 类似于 JavaScript 的 comfirm 函数 。该方法返回用户单击了 哪个按钮 showInputDialog/showInternalInputDialog 输入对话框,提示要求输入某些信息,类似于 JavaScript的 prompt 函数。该方法返回用户输入的字符串 。 showOptionDialog/showInternalOptionDialog 自定义选项对话框 ,允许使用自 定义选项 ,可以取代showConfirmDialog 所产生的对话框,只是用起来更复杂 。

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

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:自定义选项中的默认选中项

当用户与对话框交互结束后,不同类型对话框的返回值如下:

  • showMessageDialog: 无返回值 。
  • showlnputDialog: 返回用户输入或选择的字符串 。
  • showConfirmDialog: 返回 一个整数代表用户选择的选项 。
  • showOptionDialog : 返回 一个整数代表用户选择的选项,如果用户选择第一项,则返回 0; 如果选择第二项,则返回1……依此类推 。

对 showConfirmDialog 所产生的对话框,有如下几个返回值:

  • YES OPTION: 用户 单击了 "是"按钮后返回 。
  • NO OPTION: 用 户单击了"否"按钮后返回 。
  • CANCEL OPTION: 用户单击了"取消"按钮后返回 。
  • OK OPTION : 用户单击了"确定"按钮后返回 。
  • CLOSED OPTION: 用户 单击了对话框右上角的 " x" 按钮后返回。
四种对话框演示

消息对话框:

import cn.itcast.swing.util.ImagePathUtil; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class MessageDialogTest { JFrame jf = new JFrame("测试消息对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出消息对话框") { @Override public void actionPerformed(ActionEvent e) { //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.ERROR_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.INFORMATION_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.WARNING_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.QUESTION_MESSAGE); //JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.PLAIN_MESSAGE); JOptionPane.showMessageDialog(jf, jta.getText(), "消息对话框", JOptionPane.WARNING_MESSAGE, new ImageIcon(ImagePathUtil.getRealPath("2\\female.png"))); } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new MessageDialogTest().init(); } }

确认对话框:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class ConfirmDialogTest { JFrame jf = new JFrame("测试确认对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出确认对话框") { @Override public void actionPerformed(ActionEvent e) { int result = JOptionPane.showConfirmDialog(jf, jta.getText(), "确认对话框",JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (result == JOptionPane.YES_OPTION){ jta.append("\n用户点击了确定按钮"); } if (result==JOptionPane.NO_OPTION){ jta.append("\n用户点击了取消按钮"); } } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new ConfirmDialogTest().init(); } }

输入对话框:


import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class InputDialogTest { JFrame jf = new JFrame("测试输入对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出输入对话框") { @Override public void actionPerformed(ActionEvent e) { /* String result = JOptionPane.showInputDialog(jf, "请填写您的银行账号:", "输入对话框", JOptionPane.INFORMATION_MESSAGE); if(result!=null){ jta.append(result.toString()); } */ Object result = JOptionPane.showInputDialog(jf, "", "输入对话框", JOptionPane.DEFAULT_OPTION, null, new String[]{"柳岩", "舒淇", "龚玥菲"}, "舒淇"); if (result!=null){ jta.append(result.toString()); } } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new InputDialogTest().init(); } }

选项对话框:

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; public class OptionDialogTest { JFrame jf = new JFrame("测试选项对话框"); JTextArea jta = new JTextArea(6, 30); JButton btn = new JButton(new AbstractAction("弹出选项对话框") { @Override public void actionPerformed(ActionEvent e) { int result = JOptionPane.showOptionDialog(jf, "请选择尿不湿号码", "选项对话框",JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null,new String[]{"大号","中号","小号"},"中号"); switch (result){ case 0: jta.setText("用户选择了大号"); break; case 1: jta.setText("用户选择了中号"); break; case 2: jta.setText("用户选择了小号"); break; } } }); public void init(){ jf.add(jta); jf.add(btn, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); } public static void main(String[] args) { new OptionDialogTest().init(); } }

如图片失效等影响浏览文章可参阅公众号文章:

Java Swing组件在GUI编程中的应用有哪些?

  • 为组件设置边框:mp.weixin.qq.com/s/En67fcV9-IiO9V-jXL39sQ
  • 使用JToolBar创建工具条:mp.weixin.qq.com/s/IDnY_szKCG80mBR3zAzlmg
  • JColorChooser和JFileChooser:mp.weixin.qq.com/s/dvoUYVCh8GaIuXPwxZ5Cfg
  • JOptionPane:mp.weixin.qq.com/s/-XOLiMjRY0YgmkrSqHqDGA
欢迎关注我的公众号,共同学习