Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JTextArea复制为;text/html";数据风味_Java_Html_Swing_Clipboard_Jtextarea - Fatal编程技术网

Java 将JTextArea复制为;text/html";数据风味

Java 将JTextArea复制为;text/html";数据风味,java,html,swing,clipboard,jtextarea,Java,Html,Swing,Clipboard,Jtextarea,我有一个JTextArea,我正在使用一个荧光灯,根据下面我的SSCCE对我的一些文本应用一些语法高亮显示: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; public class SSCCE extends JFrame { public SSCCE() { final JTextArea aMain = new JTextArea();

我有一个
JTextArea
,我正在使用一个
荧光灯
,根据下面我的SSCCE对我的一些文本应用一些语法高亮显示:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class SSCCE extends JFrame {
  public SSCCE() {
    final JTextArea aMain = new JTextArea();
    aMain.setFont(new Font("Consolas", Font.PLAIN, 11));
    aMain.setMargin(new Insets(5, 5, 5, 5));
    aMain.setEditable(false);
    add(aMain);

    aMain.setText("The quick brown fox jumped over the lazy dog.");
    Highlighter h = aMain.getHighlighter();
    try {
      h.addHighlight(10, 15, new DefaultHighlighter.DefaultHighlightPainter(new Color(0xFFC800)));
    }
    catch (BadLocationException e) { 
      e.printStackTrace(); 
    }

    aMain.getActionMap().put("Copy", new AbstractAction() {
      public void actionPerformed(ActionEvent e) {
        aMain.copy();
      }
    });
    aMain.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "Copy");

    setTitle("SSCCE");
    setSize(350, 150);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new SSCCE();
      }
    });
  }
}
当用户选择文本的一部分并按下CTRL+C时,我调用
JTextArea
类的
copy()
方法。这会将文本作为纯文本复制到系统剪贴板上,并且我会丢失已应用于文本的任何突出显示。我正在寻找能够复制的风格信息,其中包括作为“文本/html”或“文本/rtf”突出显示。我相信我需要使用
Transferable
DataFlavor
类,但我正在努力拼凑一些东西-我不知道如何以正确的格式从
JTextArea
获取数据,以便将其放在剪贴板上


我基本上是尝试复制突出显示,然后将其粘贴到MicrosoftWord或类似的应用程序中,突出显示保持不变。样式数据是以正确的格式提供的,还是我必须通过列举所有突出显示来手动构建HTML标记?

好的,基本上,因为高亮显示只是在
JTextArea上“绘制”的,实际上并不调整文本的样式,所以您需要自己来做

基本上你需要:

  • 获取当前所有突出显示的列表
  • 从文档中提取文本
  • 把它包装成html
  • 创建一个合适的基于HTML的应用程序
  • 将html标记复制到剪贴板
轻松

import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringBufferInputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;

public class SSCCE extends JFrame {

    public SSCCE() {
        final JTextArea aMain = new JTextArea();
        aMain.setFont(new Font("Consolas", Font.PLAIN, 11));
        aMain.setMargin(new Insets(5, 5, 5, 5));
        aMain.setEditable(false);
        add(aMain);

        aMain.setText("The quick brown fox jumped over the lazy dog.");
        Highlighter h = aMain.getHighlighter();
        try {
            h.addHighlight(10, 15, new DefaultHighlighter.DefaultHighlightPainter(new Color(0xFFC800)));
        } catch (BadLocationException e) {
            e.printStackTrace();
        }

        aMain.getActionMap().put("Copy", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                Highlighter h = aMain.getHighlighter();
                Highlighter.Highlight[] highlights = h.getHighlights();
                StringBuilder sb = new StringBuilder(64);
                sb.append("<html><body>");
                boolean markedUp = false;
                for (Highlighter.Highlight highlight : highlights) {
                    int start = highlight.getStartOffset();
                    int end = highlight.getEndOffset();

                    try {
                        String text = aMain.getDocument().getText(start, end - start);

                        sb.append("<span style = 'background-color: #FFC800'>");
                        sb.append(text);
                        sb.append("</span>");
                        markedUp = true;
                    } catch (BadLocationException ex) {
                        ex.printStackTrace();
                    }
                }
                sb.append("</body></html>");
                if (markedUp) {
                    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                    clipboard.setContents(new HtmlSelection(sb.toString()), null);
                }
            }
        });
        aMain.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "Copy");

        setTitle("SSCCE");
        setSize(350, 150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SSCCE();
            }
        });
    }

    private static class HtmlSelection implements Transferable {

        private static List<DataFlavor> htmlFlavors = new ArrayList<>(3);

        static {

            try {
                htmlFlavors.add(new DataFlavor("text/html;class=java.lang.String"));
                htmlFlavors.add(new DataFlavor("text/html;class=java.io.Reader"));
                htmlFlavors.add(new DataFlavor("text/html;charset=unicode;class=java.io.InputStream"));
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }

        }

        private String html;

        public HtmlSelection(String html) {
            this.html = html;
        }

        public DataFlavor[] getTransferDataFlavors() {
            return (DataFlavor[]) htmlFlavors.toArray(new DataFlavor[htmlFlavors.size()]);
        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return htmlFlavors.contains(flavor);
        }

        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
            if (String.class.equals(flavor.getRepresentationClass())) {
                return html;
            } else if (Reader.class.equals(flavor.getRepresentationClass())) {
                return new StringReader(html);
            } else if (InputStream.class.equals(flavor.getRepresentationClass())) {
                return new StringBufferInputStream(html);
            }
            throw new UnsupportedFlavorException(flavor);
        }
    }
}
导入java.awt.Color;
导入java.awt.Font;
导入java.awt.Insets;
导入java.awt.Toolkit;
导入java.awt.datatransfer.Clipboard;
导入java.awt.datatransfer.DataFlavor;
导入java.awt.datatransfer.transfer;
导入java.awt.datatransfer.UnsupportedFlavorException;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.io.InputStream;
导入java.io.Reader;
导入java.io.StringBufferInputStream;
导入java.io.StringReader;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.AbstractAction;
导入javax.swing.JFrame;
在关闭时导入静态javax.swing.JFrame.EXIT_;
导入javax.swing.JTextArea;
导入javax.swing.KeyStroke;
导入javax.swing.SwingUtilities;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DefaultHighlighter;
导入javax.swing.text.Highlighter;
公共类SSCCE扩展JFrame{
公共服务{
最终JTextArea aMain=新JTextArea();
aMain.setFont(新字体(“Consolas”,Font.PLAIN,11));
aMain.setMargin(新插图(5,5,5,5));
aMain.setEditable(false);
添加(aMain);
敏捷的棕色狐狸跳过了懒狗;
Highlighter h=aMain.getHighlighter();
试一试{
h、 addHighlight(10,15,新的DefaultHighlighter.DefaultHighlightPainter(新颜色(0xFFC800));
}捕获(错误位置异常e){
e、 printStackTrace();
}
aMain.getActionMap().put(“复制”,新的AbstractAction()){
已执行的公共无效操作(操作事件e){
Highlighter h=aMain.getHighlighter();
Highlighter.Highlight[]highlights=h.getHighlights();
StringBuilder sb=新的StringBuilder(64);
某人加上(“”);
布尔markedUp=false;
用于(高亮显示。高亮显示:高亮显示){
int start=highlight.getStartOffset();
int end=highlight.getEndOffset();
试一试{
String text=aMain.getDocument().getText(开始,结束-开始);
某人加上(“”);
附加(正文);
某人加上(“”);
markedUp=true;
}捕获(BadLocationException ex){
例如printStackTrace();
}
}
某人加上(“”);
if(markedUp){
剪贴板剪贴板=Toolkit.getDefaultToolkit().getSystemClipboard();
setContents(新的HtmlSelection(sb.toString()),null);
}
}
});
aMain.getInputMap().put(击键.getKeyStroke(KeyEvent.VK_C,Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),“复制”);
setTitle(“SSCCE”);
设置大小(350150);
setDefaultCloseOperation(关闭时退出);
setLocationRelativeTo(空);
setVisible(真);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
新SSCCE();
}
});
}
私有静态类HtmlSelection实现可转移{
私有静态列表htmlFlavors=新的ArrayList(3);
静止的{
试一试{
add(新的DataFlavor(“text/html;class=java.lang.String”);
add(newdataflavor(“text/html;class=java.io.Reader”);
add(新的DataFlavor(“text/html;charset=unicode;class=java.io.InputStream”);
}捕获(ClassNotFoundException ex){
例如printStackTrace();
}
}
私有字符串html;
公共html选择(字符串html){
this.html=html;
}
公共DataFlavor[]getTransferDataFlavors(){
return(dataflavors[])htmlFlavors.toArray(newdataflavors[htmlFlavors.size()]);
}
支持公共布尔值IsDataFlavor(DataFlavor){
返回htmlFlavors.contains(味道);
}
公共对象getTransferData(DataFlavor flavor)引发不受支持的LavorException{
if(String.class.equals(flavor.getRepresentationClass())){
返回html;
}else if(Reader.class.equals(flavor.getRepresentation
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;

@SuppressWarnings("serial")

public class SSCCE extends JFrame {
  public SSCCE() {
    final JTextArea aMain = new JTextArea();
    aMain.setFont(new Font("Consolas", Font.PLAIN, 11));
    aMain.setMargin(new Insets(5, 5, 5, 5));
    aMain.setEditable(false);
    add(aMain);

    aMain.setText("The quick brown fox jumped over the lazy dog.");
    Highlighter h = aMain.getHighlighter();
    try {
      h.addHighlight(10, 15, new DefaultHighlighter.DefaultHighlightPainter(new Color(0xFFC800)));
    }
    catch (BadLocationException e) { 
      e.printStackTrace(); 
    }

    aMain.getActionMap().put("Copy", new AbstractAction() {
      public void actionPerformed(ActionEvent e) {
        Highlighter h = aMain.getHighlighter();
        Highlighter.Highlight[] hls = h.getHighlights();
        int start = aMain.getSelectionStart();
        int end = aMain.getSelectionEnd();
        Document d = aMain.getDocument();

        Arrays.sort(hls, new Comparator<Highlighter.Highlight>() {
          @Override
          public int compare(Highlighter.Highlight a, Highlighter.Highlight b) {
            int r = a.getStartOffset() - b.getStartOffset();
            if (r == 0) {
              r = (b.getEndOffset() - b.getStartOffset()) - (a.getEndOffset() - a.getStartOffset());
            }
            return r;
          }
        });

        try {
          StringBuilder sb = new StringBuilder();
          sb.append("<html><body>");
          sb.append("<pre style='font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 10pt'>");

          String s = d.getText(start, end - start);
          String as[] = s.replaceAll("\r?\n", "\n").split("(?!^)");
          Color ac[] = new Color[as.length];

          for (Highlighter.Highlight hl : hls) { 
            int hs = hl.getStartOffset();
            int he = hl.getEndOffset();

            if ((he > start) && (hs < end)) {
              Color c = ((DefaultHighlighter.DefaultHighlightPainter)hl.getPainter()).getColor();
              if ((c != null) && (aMain.getSelectionColor() != c)) {
                hs = (hs < start) ? start : hs;
                he = (he > end) ? end : he;

                for (int i = (hs - start); i < (he - start); i++) {
                  ac[i] = c;
                }
              }
            }
            else if (hs > end) {
              break;
            }
          }

          Color pc = null;
          for (int i = 0; i < as.length; i++) {
            if (ac[i] != pc) {
              if (pc != null) {
                sb.append("</span>");
              }
              if (ac[i] != null) {
                sb.append("<span style='background-color: " + String.format("#%02x%02x%02x", ac[i].getRed(), ac[i].getGreen(), ac[i].getBlue()) + "'>");
              }
              pc = ac[i];
            }
            sb.append(as[i].replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\n", "<br>"));
          }
          if (pc != null) {
            sb.append("</span>");
          }

          sb.append("</pre>");
          sb.append("</body></html>");

          Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
          c.setContents(new MyTransferable(s, sb.toString()), null);
        }
        catch (BadLocationException ex) {
          ex.printStackTrace();
          aMain.copy();
        }
      }
    });
    aMain.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "Copy");

    setTitle("SSCCE");
    setSize(350, 150);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  }

  private static class MyTransferable implements Transferable {
    private static ArrayList<DataFlavor> MyFlavors = new ArrayList<DataFlavor>();
    private String plain = null;
    private String html = null;

    static {
      try {
        for (String m : new String[]{"text/plain", "text/html"}) {
          MyFlavors.add(new DataFlavor(m + ";class=java.lang.String"));
          MyFlavors.add(new DataFlavor(m + ";class=java.io.Reader"));
          MyFlavors.add(new DataFlavor(m + ";class=java.io.InputStream;charset=utf-8"));
        }
      }
      catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
    }

    public MyTransferable(String plain, String html) {
      this.plain = plain;
      this.html = html;
    }

    public DataFlavor[] getTransferDataFlavors() {
      return MyFlavors.toArray(new DataFlavor[MyFlavors.size()]);
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
      return MyFlavors.contains(flavor);
    }

    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
      String s = null;
      if (flavor.getMimeType().contains("text/plain")) {
        s = plain;
      }
      else if (flavor.getMimeType().contains("text/html")) {
        s = html;
      }
      if (s != null) {
        if (String.class.equals(flavor.getRepresentationClass())) {
          return s;
        }
        else if (Reader.class.equals(flavor.getRepresentationClass())) {
          return new StringReader(s);
        }
        else if (InputStream.class.equals(flavor.getRepresentationClass())) {
          return new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8));
        }
      }
      throw new UnsupportedFlavorException(flavor);
    }
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new SSCCE();
      }
    });
  }
}