• 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("
    ", "<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;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;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);
        }
    }
    View Code

  • 相关阅读:
    探索c#之Async、Await剖析
    探索C#之布隆过滤器(Bloom filter)
    探索C#之虚拟桶分片
    刷新本地的DNS缓存数据
    php取整函数ceil,floor,round,intval函数的区别
    这样顶级人生规划 ,想不成功都难
    全篇干货,10分钟带你读透《参与感》
    iOS审核秘籍】提审资源检查大法
    php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组
    RDS MySQL 连接数满情况的处理
  • 原文地址:https://www.cnblogs.com/swtjavaspace/p/9004286.html
Copyright © 2020-2023  润新知