使用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执行过滤器初始化操作:
  1. addChoosableFileFilter(FileFilter filter): 添加文件过滤器 通过该方法允许该文件对话框有多个文件过滤器。
  2. 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);
}
}
效果图

java 图形化工具Swing 颜色文件选择器 ;JColorChooser;JFileChoose的更多相关文章

  1. java 图形化工具Swing 创建工具条

    通过JToolBar来创建工具条: Swing提供了JToolBar类来创建工具条,创建JToolBar对象时可以指定如下两个参数: (1),name: 该参数指定该工具条的名称. (2),orien ...

  2. java 图形化工具Swing 基本使用

    Swing介绍: 使用Swing开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100% Java实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平 ...

  3. java 图形化工具Swing 监听键盘输入字符触发动作getInputMap();getActionMap();

    双缓冲技术的介绍: 所有的Swing组件默认启用双缓冲绘图技术.使用双缓冲技术能改进频繁重绘GUI组件的显示效果(避免闪烁现象)JComponent组件默认启用双缓冲,无须自己实现双缓冲.如果想关闭双 ...

  4. Java 图形化界面设计(GUI)实战练习(代码)

    关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...

  5. 转:二十七、Java图形化界面设计——容器(JFrame)

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

  6. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

  7. Java图形化界面设计——中间容器(Jpanel)

    1.  将组件添加到JFrame中 方式之一: frame.getContentPane().add(childComponent) 用getContentPane()方法获得JFrame的内容面板, ...

  8. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

  9. 02 Java图形化界面设计——中间容器(Jpanel)

    上一篇讲解了Jframe顶层容器,例子中生成了一个空的窗体,在实际编程过程中,一般很少将文本框.按钮等组件直接放在顶层容器中进行布局,大多数时候是通过布局管理器结合中间容器对组件进行布局设置. 1.  ...

随机推荐

  1. 记一次 .NET 某智能服装智造系统 内存泄漏分析

    一:背景 1. 讲故事 上个月有位朋友找到我,说他的程序出现了内存泄漏,不知道如何进一步分析,截图如下: 朋友这段话已经说的非常言简意赅了,那就上 windbg 说话吧. 二:Windbg 分析 1. ...

  2. java 装饰器模式实现代码

    目录 1.实现装饰器模式 1.1.公共接口 1.2.接口实现 1.3.装饰器 1.4.装饰构件 1.5.测试装饰器 上图展示的是io流中的一个装饰者模式的代码结构 1.实现装饰器模式 汽车厂生产汽车实 ...

  3. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  4. R语言与医学统计图形-【17】ggplot2几何对象之热图

    ggplot2绘图系统--heatmap.geom_rect 这里不介绍更常见的pheatmap包. 1.heatmap函数 基础包. data=as.matrix(mtcars) #接受矩阵 hea ...

  5. Oracle-除了会排序,你对ORDER BY的用法可能一无所知!

    导读 为什么只有ORDER BY后面可以使用列别名 为什么不推荐使用ORDER BY后接数字来排序 为什么视图和子查询里面不能使用ORDER BY -- ​小伙伴们在进行SQL排序时,都能很自然的使用 ...

  6. void * 指针和const 指针

    1.void * 是不能进行运算的,例如void *p  p++; 这2个值是没有任何规律的. 2 .printf的时候打印void *p 指向的数据,必须强制类型转换,因为编译器不知道取地址多少位. ...

  7. dart系列之:还在为编码解码而烦恼吗?用dart试试

    目录 简介 为JSON编码和解码 UTF-8编码和解码 总结 简介 在我们日常使用的数据格式中json应该是最为通用的一个.很多时候,我们需要把一个对象转换成为JSON的格式,也可以说需要把对象编码为 ...

  8. A Child's History of England.18

    But, although she was a gentle lady, in all things worthy to be beloved - good, beautiful, sensible, ...

  9. 零基础学习java------day17------缓冲字节流,转换字节流,简化流,缓冲字符流,序列化和对象流

    1. 缓冲字节流 缓冲区:缓冲区实质上是一个数组.通常它是一个字节数组,但是也可以使用其他种类的数组.但是一个缓冲区不 仅仅 是一个数组.缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程 ...

  10. 【1】Embarrassingly Parallel(易并行计算问题)

    1.什么是Embarrassingly Parallel(易并行计算问题) 易并行计算问题:A computation that can be divided into a number of  co ...