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 聊天窗体,支持图文模式的更多相关文章

  1. IOS开发UI篇--一个支持图文混排的ActionSheet

    一.简单介绍 UIActionSheet是IOS提供给我们开发人员的底部弹出菜单控件.一般用于菜单选择.操作确认.删除确认等功能.IOS官方提供的下面方式对UIActionView进行实例化: - ( ...

  2. Swing常用窗体

    Swing常用窗体 Swing 主要具有以下特点: ( 1 )轻量级组件. ( 2 )可插入外观组件. 窗体作为Swing的应用程序中组件的承载体,处于非常重要的地位.Swing中常用的窗体包括JFr ...

  3. C# 非模式窗体show()和模式窗体showdialog()的区别(转)

    对话框不是模式就是无模式的.模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载).例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击“确定”或“取消”,则它就是模 ...

  4. 二十九、EFW框架开发的系统支持SaaS模式和实现思路

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  5. JavaScript和angularJs语法支持严格模式:”use strict”

    如果给JavaScript和angularjs代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的.其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常.其二:如果在运 ...

  6. nginx低版本不支持pathinfo模式,thinkphp针对此问题的解决办法

    将一个thinkphp项目从apache环境移到nginx1.2上,怎奈,nginx这个版本默认不支持pathinfo模式 首先,编辑nginx的虚拟主机配置文件 location ~ .*.(php ...

  7. JavaScript语法支持严格模式:"use strict"

    如果给JavaScript代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的.其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常.其二:如果在运行期出现了违反严格模 ...

  8. AS3聊天单行输入框图文混排完美实现

    几年前刚毕业.第一个游戏模块做的就是聊天.到如今.几个游戏写过几次聊天模块. 之前在4399做的<幻龙骑士>(又名<神骑士>),还有上周六刚上线的<疯狂的子弹>, ...

  9. 浅谈C#中的模式窗体和非模式窗体

    ShowDialog(); // 模式窗体 Show(); // 非模式窗体 区别: 返回值不同,DialogResult/void 模式窗体会使程序中断,直到关闭模式窗口 打开模式窗体后不能切换到应 ...

  10. C# 非模式窗体show()和模式窗体showdialog()的区别

    对话框不是模式就是无模式的.模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载).例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击"确定"或 ...

随机推荐

  1. vim 学习总结

    vim 学习总结 一.介绍 vi 编辑器是所有 Unix 及 Linux 系统下标准的编辑器,类似于 Windows 系统下的 notepad(记事本)编辑器.在 Unix 及 Linux 系统的任何 ...

  2. react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁

    react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁 let imageTopBg if (imgSrcBg) { c ...

  3. 【LLM】在Colab上使用免费T4 GPU进行Chinese-Llama-2-7b-4bit推理

    一.配置环境 1.打开colab,创建一个空白notebook,在[修改运行时环境]中选择15GB显存的T4 GPU. 2.pip安装依赖python包 !pip install --upgrade ...

  4. mybatis-plus处理blob字段

    转载自:www.javaman.cn 在 Spring Boot 项目中使用 MyBatis-Plus 处理 longblob 字段时,我们可以按照以下步骤进行操作.假设 longblob 存储的是字 ...

  5. Maven项目不同jar包相同类名的引用问题

    本文简单记录下一个小问题 问题描述: 在一个Maven项目中,引用了两个jar包,其中两个jar包中,都含有个相同类(包名也相同),这个时候代码里使用该类,出现引用失败的问题 如下图所示,展开两个ja ...

  6. Android JNI静态和动态注册 、Java Reflect(C或C++层反射和JAVA层反射)、Java 可变参数(JNI实现)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. 记录-关于console你不知道的那些事

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 了解 console ● 什么是 console ? console 其实是 JavaScript 内的一个原生对象 内部存储的方法大部分 ...

  8. 记录--分享8个非常实用的Vue自定义指令

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也允许注册自定义指令.它的作用价值在于当开发人员 ...

  9. OpenCvSharp+Yolov5Net+Onnx 完整Demo

    效果 工程 代码 using Microsoft.ML.OnnxRuntime; using OpenCvSharp; using System; using System.Collections.G ...

  10. C# 平台调用过程

    (1)调用LoadLibrary加载非托管DLL到内存中,并调用GetProcAddress 获得内存中非托管函数的指针. (2)  为包含非托管函数地址的托管签名生成一个DllImport存根(st ...