使用JColorChooser:
JColorChooser用于创建颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法:
- (1),showDialog(Component component, String title, Color initialColor): 显示一个模式的颜色选择器对话框,该方法返回用户所选颜色。其中component指定该对话框的parent组件,而title指定该对话框的标题,大部分时候都使用该方法来让用户选择颜色。
- (2),createDialog(Component c, String title, boolean modal, JColorChooser chooserPane, ActionListener,okListener, ActionListener cancelListener): 该方法返回一个对话框,该对话框内包含指定的颜色选择器,该方法可以指定该对话框是模式的还是非模式的(通过 modal 参数指定) 还可以指定该对话框内"确定"按钮的事件监 器(通过 okListener 参数指定)和"取消"按钮的事件监听器 (通过 cancelLi tener 参数指定)。
下面修改我们的手绘程序,用JColorChooser来实现:
fontColor = JColorChooser.showDialog(jframe,"请选择颜色",Color.red,true);
注意:swing 的JFrame 添加组件逻辑有点傻逼:JFrame.pack() 只会根据最后一次添加的组件大小设置窗口大小。本例手绘程序如果添加右键菜单项:jframe.add(jpopupMenu);是最后添加的组件,则窗口要比画板尺寸小。
package swingtest; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; /** * @ClassName DrawCanvasTest * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/5/8. */ public class DrawCanvasSwingTest { /** * 窗口 */ private JFrame jframe = new JFrame("JFrame手绘程序"); /** * 定义画板 */ private final int canvasWidth = 600; private final int canvasHeight = 400; private Canvas canvas = new DrawCanvas(); /** * 定义图片 */ private BufferedImage image = new BufferedImage(canvasWidth,canvasHeight,BufferedImage.TYPE_INT_BGR); /** * 获取图片对应的画笔,画笔的初始位置,初始颜色 */ private Graphics2D imageGraphics = (Graphics2D) image.getGraphics(); private int drawX = -1; private int drawY = -1; private Color fontColor = new Color(255); /** * 画笔右键菜单 */ JPopupMenu jpopupMenu = new JPopupMenu(); JMenuItem colorChoseItem = new JMenuItem("选择颜色"); /** * 定义画板子类,定义画图图片 */ private class DrawCanvas extends Canvas { @Override public void paint(Graphics g) { g.drawImage(image,0, 0, null); } } private void start(){ /** * 画板大小设置 */ canvas.setSize(canvasWidth, canvasHeight); /** * 设置画笔粗细 */ imageGraphics.setStroke(new BasicStroke(5f)); /** * 画笔右键菜单组合。添加到窗口,设置颜色选择器 */ jpopupMenu.add(colorChoseItem); colorChoseItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { fontColor = JColorChooser.showDialog(jframe,"请选择颜色",Color.red,true); } }); /** * 画板中图片背景画成白色 */ imageGraphics.fillRect(0, 0, canvasWidth, canvasHeight); /** * 按下鼠标拖动时画图 */ canvas.addMouseMotionListener(new MouseAdapter() { //按下鼠标拖动 @Override public void mouseDragged(MouseEvent e) { /** * 如果位置不在初始位置,开始画图 */ if (drawX != -1 && drawY != -1){ imageGraphics.setColor(fontColor); imageGraphics.drawLine(drawX, drawY, e.getX(), e.getY()); canvas.repaint(); }//移动画笔位置到当前鼠标位置 drawX = e.getX(); drawY = e.getY(); } }); /** * 松开鼠标画笔归位-1;-1; */ canvas.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { drawX = -1; drawY = -1; //如果是右键松开弹出选择颜色的弹框 if (e.isPopupTrigger()){ jpopupMenu.show(canvas,e.getX(), e.getY()); } } }); /** * 窗口关闭 */ jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /** * 窗口添加组件,设置位置大小,注意这里要把jframe要添加的组件中尺寸最大的最后添加,.pack() 才能调接到最大尺寸 */ jframe.add(jpopupMenu); jframe.add(canvas); jframe.setLocation(400,300); jframe.pack(); jframe.setVisible(true); } public static void main(String[] args) { new DrawCanvasSwingTest().start(); } }
JFileChooser:
JFileChooser的功能与AWT中的FileDialog基本相似,也是用于生成"打开文件"、"保存文件"对话框。与FileDialog不同的是JFileChooser无须依赖于本地平台的GUI,它由100%Java实现,在所有平台 具有完全相同的行为,并可以在所有平台上具有相同的外观风格。
JFileChooseer的使用步骤如下:
- 采用构造器创建一个JFileChooser对象,该JFileChooser对象无须指定parent组件,这表示可以在多个窗口中共用该JFileChooser对象。创建JFileChooser对象时可以指定初始化路径:JFileChooser chooser = new JFileChooser(".");
- 调用JFileChooser系列可选的方法对JFileChooser 执行初始化操作。
- setSelectedFile/setSelectedFiles: 指定该文件选择器默认选择的文件(也可以默认选择多个文件)。
//默认选择当前路径下的123.jpg文件
chooser.setSelectedFile(new File( "123.jpg" ));
setMultiSelectionEnabled(boolean b): 在默认情况下,该文件选择器只能选择一个文件,通过调用该方法可以设置允许选择多个文件(设置参数值为 true 即可)。
- setFileSelectionMode(int mode): 在默认情况下,该文件选择器只能选择文件,通过调用该方法可以设置允许选择文件、路径、 文件与路径,设置参数值为JFileChooser.FILES_ONLY
JFileChooser.DlRECTORIES_ONLY
JFileChooser.FILES_AND_DIRECTORIES
- 用JFileChooser系列可选的方法对JFileChooser执行过滤器初始化操作:
- addChoosableFileFilter(FileFilter filter): 添加文件过滤器 通过该方法允许该文件对话框有多个文件过滤器。
- setFileFilter(FileFilter filter): 设置文件过滤器 。一旦调用了该方法,将导致该文件对话框只有过滤器
- 调用showXxxDialog方法可以打开文件对话框
测试代码:
文件选择器的定义和配置
JFileChooser jFileChooser = new JFileChooser(".");//文件选择器构造
jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("选择图片(*.jpg,*.png,*.gif,*.goubi)","jpg", "gif", "png","goubi")); //配置文件过滤器
jFileChooser.setAcceptAllFileFilterUsed(true); //设置接受所有文件过滤器
文件选择器的使用:
事件监听器触发文件选择器show展示在对应组件中,返回选择的结果进行判断和处理。
int result = jFileChooser.showOpenDialog(jFrame); 定义变量查看文件选择器选择后的结果
result == JFileChooser.APPROVE_OPTION 文件选择成功
jFileChooser.getSelectedFile().getPath();从文件选择器获取文件路径。做对应处理
知识点+:图片在JFrame组件JLabel组件中展示
JLabel label = new JLabel();
jFrame.add(label);
label.setIcon(new ImageIcon(openFilePath))
完整测试代码
package swingtest; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * @ClassName ImageShowSwing * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/5/9. */ public class ImageShowSwing { public static void main(String[] args) { JFrame jFrame = new JFrame("图片查看器"); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("文件"); JMenuItem openMenuItem = new JMenuItem("打开"); fileMenu.add(openMenuItem); menuBar.add(fileMenu); jFrame.setJMenuBar(menuBar); JLabel label = new JLabel(); jFrame.add(label); /** * 文件过滤器设置:打开的默认文件路径.为当前路径 */ JFileChooser jFileChooser = new JFileChooser("."); /** * 自定义文件过滤器,可以设置任何规则,比如以什么文件名开头,或者文件名结尾。 */ // jFileChooser.addChoosableFileFilter(new FileFilter() { // @Override // public boolean accept(File f) { // if (f.isDirectory()) { // return true; // } // String name = f.getName().toLowerCase(); // List<String> extensions = Arrays.asList(".jpg", ".gif", ".png"); // for (String extension : extensions) { // if (name.endsWith(extension)) { // return true; // } // } // return false; // } // @Override // public String getDescription() { // return "选择图片(*.jpg,*.png,*.gif)"; // } // }); /** * 使用已有文件名(后缀)过滤器 FileNameExtensionFilter(String description, String... extensions) */ jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("选择图片(*.jpg,*.png,*.gif,*.goubi)","jpg", "gif", "png","goubi")); //让不能被文件过滤器过滤的文件,不展示在我们的这个选择对话框内 jFileChooser.setAcceptAllFileFilterUsed(true); openMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("点击了打开文件"); int result = jFileChooser.showOpenDialog(jFrame); if (result == JFileChooser.APPROVE_OPTION) {//如果图片文件被打开了 String openFilePath = jFileChooser.getSelectedFile().getPath(); label.setIcon(new ImageIcon(openFilePath)); } } }); jFrame.setBounds(100, 100, 600, 600); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); jFrame.setVisible(true); } }
效果图
![](https://img2020.cnblogs.com/blog/1394238/202105/1394238-20210509162321355-921428251.png)