swing 聊天窗体,支持图文模式
package com.*.test; import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException; import javax.swing.JFrame;
import javax.swing.text.EditorKit;
import javax.swing.text.html.HTMLEditorKit; import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils; import javax.swing.JEditorPane;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener; import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.awt.event.ActionEvent; public class ChatForm { private JFrame frame; /**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatForm window = new ChatForm();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the application.
*/
public ChatForm() {
initialize();
} /**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame("与 XXX 对话");
frame.setSize(766, 615);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
EditorKit k = new HTMLEditorKit(); JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(10, 10, 730, 350);
frame.getContentPane().add(scrollPane_1); final JEditorPane editorPane = new JEditorPane();
scrollPane_1.setViewportView(editorPane);
editorPane.setEditable(false);
editorPane.setEditorKit(k); JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 373, 730, 161);
frame.getContentPane().add(scrollPane); final JEditorPane editorPane_1 = new JEditorPane();
scrollPane.setViewportView(editorPane_1);
editorPane_1.setEditorKit(k); // 注册剪贴板事件
KeyStroke aKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK, true);
editorPane_1.addAncestorListener(new AncestorListener() { @Override
public void ancestorRemoved(AncestorEvent event) {
System.out.println("ancestorRemoved");
} @Override
public void ancestorMoved(AncestorEvent event) {
System.out.println("ancestorMoved");
System.out.println(editorPane_1.getText());
} @Override
public void ancestorAdded(AncestorEvent event) {
System.out.println("ancestorAdded"); }
}); // 注册ctrl+v事件,每次添加都是在文档html末尾追加的方式,所以可以多次粘贴
editorPane_1.registerKeyboardAction(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
DataFlavor[] flavots = Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors();
for (DataFlavor dataFlavor : flavots) {
try { // 获取剪贴板数据
Object obj = Toolkit.getDefaultToolkit().getSystemClipboard().getData(dataFlavor);
System.out.println(obj.getClass());
// 如果是文字内容
if (obj instanceof InputStream) {
InputStream bts = (InputStream) obj;
editorPane_1.setText(editorPane_1.getText().replace("</body>", IOUtils.readLines(bts, "utf-8").toString().replaceAll("\n", "<br/></body>")));
} else if (obj instanceof Collection<?>) {
// 多文件内容
Collection<?> c = (Collection<?>) obj;
String s = ""; for (Object object : c) {
File f = (File) object;
if (FilenameUtils.getExtension(f.getName()).equals("jpg")) {
s += "<img style=\\\"height:300px;width:200px\\\" src='file:///" + f.getAbsolutePath() + "'/><br/>";
}
}
editorPane_1.setText(s.replace("</body>", s + "</br></body>"));
} else if (obj instanceof BufferedImage) {
// 截图内容
BufferedImage img = (BufferedImage) obj;
String savePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
savePath = FilenameUtils.separatorsToUnix(savePath);
System.out.println(savePath);
File file = new File(savePath + "/" + System.currentTimeMillis() + ".png");
ImageIO.write(img, "png", file); editorPane_1.setText(editorPane_1.getText().replace("</body>", "<img style=\"height:300px;width:200px\" src='file:///" + file.getAbsolutePath() + "'/><br/></body>"));
}
} catch (HeadlessException e1) {
e1.printStackTrace();
} catch (UnsupportedFlavorException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}, aKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
JButton button = new JButton("发送"); // 点击发送按钮的事件
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 清空下面的内容,设置上面的内容
String s = editorPane_1.getText();
editorPane_1.setText("");
editorPane.setText(s);
}
}); // 注册ctrl+回车事件
button.registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 清空下面的内容,设置上面的内容
String s = editorPane_1.getText();
editorPane_1.setText("");
editorPane.setText(s);
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, ActionEvent.CTRL_MASK, true), JComponent.WHEN_IN_FOCUSED_WINDOW);
button.setBounds(628, 544, 93, 23);
frame.getContentPane().add(button);
}
}

swing 聊天窗体,支持图文模式的更多相关文章
- IOS开发UI篇--一个支持图文混排的ActionSheet
一.简单介绍 UIActionSheet是IOS提供给我们开发人员的底部弹出菜单控件.一般用于菜单选择.操作确认.删除确认等功能.IOS官方提供的下面方式对UIActionView进行实例化: - ( ...
- Swing常用窗体
Swing常用窗体 Swing 主要具有以下特点: ( 1 )轻量级组件. ( 2 )可插入外观组件. 窗体作为Swing的应用程序中组件的承载体,处于非常重要的地位.Swing中常用的窗体包括JFr ...
- C# 非模式窗体show()和模式窗体showdialog()的区别(转)
对话框不是模式就是无模式的.模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载).例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击“确定”或“取消”,则它就是模 ...
- 二十九、EFW框架开发的系统支持SaaS模式和实现思路
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- JavaScript和angularJs语法支持严格模式:”use strict”
如果给JavaScript和angularjs代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的.其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常.其二:如果在运 ...
- nginx低版本不支持pathinfo模式,thinkphp针对此问题的解决办法
将一个thinkphp项目从apache环境移到nginx1.2上,怎奈,nginx这个版本默认不支持pathinfo模式 首先,编辑nginx的虚拟主机配置文件 location ~ .*.(php ...
- JavaScript语法支持严格模式:"use strict"
如果给JavaScript代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的.其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常.其二:如果在运行期出现了违反严格模 ...
- AS3聊天单行输入框图文混排完美实现
几年前刚毕业.第一个游戏模块做的就是聊天.到如今.几个游戏写过几次聊天模块. 之前在4399做的<幻龙骑士>(又名<神骑士>),还有上周六刚上线的<疯狂的子弹>, ...
- 浅谈C#中的模式窗体和非模式窗体
ShowDialog(); // 模式窗体 Show(); // 非模式窗体 区别: 返回值不同,DialogResult/void 模式窗体会使程序中断,直到关闭模式窗口 打开模式窗体后不能切换到应 ...
- C# 非模式窗体show()和模式窗体showdialog()的区别
对话框不是模式就是无模式的.模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载).例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击"确定"或 ...
随机推荐
- 淘宝电商api接口 获取商品详情 搜索商品
iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的taobao淘宝电商数据采集API,供用户按需调用. 接口使用详情请参考淘宝接口文档 接口列 ...
- 2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di
2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同.实现一个叫「餐盘」的类 DinnerPlates, Di ...
- 春风吹又生的开源项目「GitHub 热点速览」
随着上周知名 Switch 开源模拟器 Yuzu(柚子)被任天堂起诉,该项目作者就删库了,但还是要赔偿任天堂数百万美元.此事还在 GitHub 上掀起了一波 Yuzu fork 项目的小浪潮,正所谓野 ...
- SPEAK 510全向麦克风无线蓝牙拾音器产品体验及评测
产品简介 大家开会的时候,很多人都直接使用手机app了,比如,zoom,腾讯会议等.既方便又快捷.由于手机设备拾音距离有限,也不是针对会议场景做的,所有,在多人会议的时候,问题就出来了.这个时 ...
- RabbitMq消息队列进一步认识
参考:https://www.cnblogs.com/wanglijun/p/10896896.html(应用场景) https://blog.csdn.net/weixin_41588751/art ...
- C++实现常用的文件操作
①输出到文本文件(txt) 1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 int main ...
- PXE批量安装操作系统自动化
PXEz自动化 在PXE服务器操作: *yum -y install dhcp xinetd tftp tftp-server* *yum -y install system-config-kicks ...
- JS(入门)
一. 编程语言 1.1 编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.计算机程序:就是计算机所执行的一系列的指令集合,而程序全部都是用我们所掌握的语言 ...
- python基础五(文件操作)
一 文件操作 一 介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...
- Mac M芯片使用PD安装centos7无页面安装
1.选择Centos镜像 点击继续 设置虚拟机名称: 点击创建 : 选择第一个回车开始下载系统,下载完成进入设置页面,首先输入 1 设置语言: 进入语言设置,选择77普通话: 选择c继续,又回到系统配 ...