Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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 JEditorPane中的HTMLEditorKit和自定义标记_Java_Swing_Dtd_Jeditorpane_Htmleditorkit - Fatal编程技术网

Java JEditorPane中的HTMLEditorKit和自定义标记

Java JEditorPane中的HTMLEditorKit和自定义标记,java,swing,dtd,jeditorpane,htmleditorkit,Java,Swing,Dtd,Jeditorpane,Htmleditorkit,我使用说明添加自己的标签 } 不幸的是,它不能正常工作: 有人能帮我吗?它使用以下程序(jdk 1.7)为我工作: 唯一的更改是键:“DTD_键”大写 我发现键“DTD_key”使用 我查看了JDK 7的源代码:DTD不再存储在javax.swing.text.html.parser.ParserDelegator的属性DTD中,而是存储在sun.awt.AppContext中。来自sun包的AppContext不应该由JRE之外的类访问。 因此,使用javax.swing.text.html

我使用说明添加自己的标签

}

不幸的是,它不能正常工作:


有人能帮我吗?

它使用以下程序(jdk 1.7)为我工作:

唯一的更改是键:
“DTD_键”
大写

我发现键“DTD_key”使用


我查看了JDK 7的源代码:
DTD
不再存储在
javax.swing.text.html.parser.ParserDelegator
的属性
DTD
中,而是存储在
sun.awt.AppContext
中。来自sun包的AppContext不应该由JRE之外的类访问。 因此,使用
javax.swing.text.html.parser.ParserDelegator
的源代码,我编写了自己加载DTD的
MyParserDelegator
。之后,可以轻松地在DTD中添加自定义标记

下面的代码还包含从中获取工作示例的其他类

import java.awt.Component;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.ComponentView;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLEditorKit.Parser;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.html.StyleSheet;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.parser.DocumentParser;
import javax.swing.text.html.parser.ParserDelegator;

public class CustomTag {
    public static String htmlText = "<html>\n" + "<body>\n" + "<p>\n" + "Text before button\n" + "<button>Text for &lt;button&gt; tag</button>\n"
            + "Text after button\n" + "</p>\n" + "</body>\n" + "</html>";
    JEditorPane edit = new JEditorPane();

    public CustomTag() {
        JFrame frame = new JFrame("Custom tag in HTMLEditorKit");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new JScrollPane(edit));

        edit.setEditorKit(new MyHTMLEditorKit());
        edit.setText(htmlText);

        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        new CustomTag();
    }

}

class MyHTMLEditorKit extends HTMLEditorKit {

    public MyHTMLEditorKit() {
        super();
    }

    @Override
    public Document createDefaultDocument() {
        StyleSheet styles = getStyleSheet();
        StyleSheet ss = new StyleSheet();

        ss.addStyleSheet(styles);

        MyHTMLDocument doc = new MyHTMLDocument(ss);
        doc.setParser(getParser());
        doc.setAsynchronousLoadPriority(4);
        doc.setTokenThreshold(100);
        return doc;
    }

    @Override
    public ViewFactory getViewFactory() {
        return new MyHTMLFactory();
    }

    Parser defaultParser;

    @Override
    protected Parser getParser() {
        if (defaultParser == null) {
            defaultParser = new MyParserDelegator();
        }
        return defaultParser;
    }

    class MyHTMLFactory extends HTMLFactory implements ViewFactory {
        public MyHTMLFactory() {
            super();
        }

        @Override
        public View create(Element element) {
            HTML.Tag kind = (HTML.Tag) (element.getAttributes().getAttribute(javax.swing.text.StyleConstants.NameAttribute));

            if (kind instanceof HTML.UnknownTag && element.getName().equals("button")) {

                return new ComponentView(element) {
                    @Override
                    protected Component createComponent() {
                        JButton button = new JButton("Button : text unknown");

                        try {
                            int start = getElement().getStartOffset();
                            int end = getElement().getEndOffset();
                            String text = getElement().getDocument().getText(start, end - start);
                            button.setText(text);
                        } catch (BadLocationException e) {
                            e.printStackTrace();
                        }

                        return button;
                    }
                };

            }
            return super.create(element);
        }
    }
}

class MyHTMLDocument extends HTMLDocument {
    public MyHTMLDocument(StyleSheet styles) {
        super(styles);
    }

    @Override
    public HTMLEditorKit.ParserCallback getReader(int pos) {
        Object desc = getProperty(Document.StreamDescriptionProperty);
        if (desc instanceof URL) {
            setBase((URL) desc);
        }
        return new MyHTMLReader(pos);
    }

    class MyHTMLReader extends HTMLDocument.HTMLReader {
        public MyHTMLReader(int offset) {
            super(offset);
        }

        @Override
        public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
            if (t.toString().equals("button")) {
                registerTag(t, new BlockAction());
            }
            super.handleStartTag(t, a, pos);
        }
    }
}

class MyParserDelegator extends Parser {
    private DTD _dtd;

    public MyParserDelegator() {
        String nm = "html32";
        try {
            _dtd = DTD.getDTD(nm);
            createDTD(_dtd, nm);

            javax.swing.text.html.parser.Element div = _dtd.getElement("div");
            _dtd.defineElement("button", div.getType(), true, true, div.getContent(), null, null, div.getAttributes());
        } catch (IOException e) {
            // (PENDING) UGLY!
            System.out.println("Throw an exception: could not get default dtd: " + nm);
        }
    }

    protected static DTD createDTD(DTD dtd, String name) {
        InputStream in = null;
        try {
            String path = name + ".bdtd";
            in = ParserDelegator.class.getResourceAsStream(path);
            if (in != null) {
                dtd.read(new DataInputStream(new BufferedInputStream(in)));
                DTD.putDTDHash(name, dtd);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return dtd;
    }

    @Override
    public void parse(Reader r, ParserCallback cb, boolean ignoreCharSet) throws IOException {
        new DocumentParser(_dtd).parse(r, cb, ignoreCharSet);
    }
}
导入java.awt.Component;
导入java.io.BufferedInputStream;
导入java.io.DataInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.Reader;
导入java.net.URL;
导入javax.swing.JButton;
导入javax.swing.JEditorPane;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.ComponentView;
导入javax.swing.text.Document;
导入javax.swing.text.Element;
导入javax.swing.text.MutableAttributeSet;
导入javax.swing.text.View;
导入javax.swing.text.ViewFactory;
导入javax.swing.text.html.html;
导入javax.swing.text.html.HTMLDocument;
导入javax.swing.text.html.HTMLEditorKit;
导入javax.swing.text.html.HTMLEditorKit.Parser;
导入javax.swing.text.html.HTMLEditorKit.ParserCallback;
导入javax.swing.text.html.StyleSheet;
导入javax.swing.text.html.parser.DTD;
导入javax.swing.text.html.parser.DocumentParser;
导入javax.swing.text.html.parser.ParserDelegator;
公共类CustomTag{
公共静态字符串htmlText=“\n”+“\n”+”\n“+”按钮前的文本\n“+”按钮标记的文本\n”
+按钮后面的文本\n“+”

\n“+”\n“+”; JEditorPane edit=新建JEditorPane(); 公共CustomTag(){ JFrame=newjframe(“HTMLEditorKit中的自定义标记”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane(); setEditorKit(新的MyHTMLEditorKit()); edit.setText(htmlText); 框架。设置尺寸(300300); frame.setLocationRelativeTo(空); frame.setVisible(true); } 公共静态void main(字符串[]args)引发异常{ 新CustomTag(); } } 类MyHTMLEditorKit扩展了HTMLEditorKit{ 公共MyHTMLEditorKit(){ 超级(); } @凌驾 公共文档createDefaultDocument(){ 样式表样式=getStyleSheet(); 样式表ss=新样式表(); ss.addStyleSheet(样式); MyHTMLDocument doc=新的MyHTMLDocument(ss); setParser(getParser()); doc.setAsynchronousLoadPriority(4); 文档设置令牌阈值(100); 退货单; } @凌驾 公共ViewFactory getViewFactory(){ 返回新的MyHTMLFactory(); } 语法分析器; @凌驾 受保护的解析器getParser(){ if(defaultParser==null){ defaultParser=新的MyParserDelegator(); } 返回默认语法分析器; } 类MyHTMLFactory扩展HTMLFactory实现ViewFactory{ 公共MyHTMLFactory(){ 超级(); } @凌驾 公共视图创建(元素){ Tag kind=(HTML.Tag)(element.getAttributes().getAttribute(javax.swing.text.StyleConstants.NameAttribute)); if(种类实例of HTML.UnknownTag&&element.getName().equals(“按钮”)){ 返回新组件视图(元素){ @凌驾 受保护的组件createComponent(){ JButton按钮=新JButton(“按钮:文本未知”); 试一试{ int start=getElement().getStartOffset(); int end=getElement().getEndOffset(); 字符串text=getElement().getDocument().getText(开始,结束-开始); 按钮.setText(文本); }捕获(错误位置异常e){ e、 printStackTrace(); } 返回按钮; } }; } 返回super.create(元素); } } } 类MyHTMLDocument扩展了HTMLDocument{ 公共MyHTMLDocument(样式表样式){ 超级(风格); } @凌驾 公共HTMLEditorKit.ParserCallback getReader(int-pos){ Object desc=getProperty(Document.StreamDescriptionProperty); if(描述URL的实例){ setBase((URL)desc); } 返回新的MyHTMLReader(pos); } 类MyHTMLReader扩展了HTMLDocument.HTMLReader{ 公共MyHTMLReader(整数偏移){ 超级(偏置); } @凌驾 public void handleStartTag(HTML.Tag t、MutableAttributeSet a、int pos){ if(t.toString().equals(“按钮”)){ registerTag(t,newblockaction()); } super.handleStartTag(t、a、pos); } } } 类MyParserDelegator扩展了语法分析器{ 私人数码电视(数码电视);; 公共MyParserDelegator(){ 字符串nm=“html32”; 试一试{ _dtd=dtd.getDTD(nm); 创建的dtd(_dtd,nm); javax.swing.text.html.parser.Element div=\u dtd.getElement(“div”); _defineElement(“按钮”,div.getType(),true,true,div.getContent(),null,null,div.getAttributes()); }捕获(IOE异常){ //(待定)丑陋! 系统
Field f = javax.swing.text.html.parser.ParserDelegator.class.getDeclaredField("DTD_KEY");
Field[] flds = javax.swing.text.html.parser.ParserDelegator.class.getDeclaredFields();
for (Field f: flds)  
{
       System.err.println(f.getName());
}
import java.awt.Component;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.ComponentView;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLEditorKit.Parser;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.html.StyleSheet;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.parser.DocumentParser;
import javax.swing.text.html.parser.ParserDelegator;

public class CustomTag {
    public static String htmlText = "<html>\n" + "<body>\n" + "<p>\n" + "Text before button\n" + "<button>Text for &lt;button&gt; tag</button>\n"
            + "Text after button\n" + "</p>\n" + "</body>\n" + "</html>";
    JEditorPane edit = new JEditorPane();

    public CustomTag() {
        JFrame frame = new JFrame("Custom tag in HTMLEditorKit");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new JScrollPane(edit));

        edit.setEditorKit(new MyHTMLEditorKit());
        edit.setText(htmlText);

        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        new CustomTag();
    }

}

class MyHTMLEditorKit extends HTMLEditorKit {

    public MyHTMLEditorKit() {
        super();
    }

    @Override
    public Document createDefaultDocument() {
        StyleSheet styles = getStyleSheet();
        StyleSheet ss = new StyleSheet();

        ss.addStyleSheet(styles);

        MyHTMLDocument doc = new MyHTMLDocument(ss);
        doc.setParser(getParser());
        doc.setAsynchronousLoadPriority(4);
        doc.setTokenThreshold(100);
        return doc;
    }

    @Override
    public ViewFactory getViewFactory() {
        return new MyHTMLFactory();
    }

    Parser defaultParser;

    @Override
    protected Parser getParser() {
        if (defaultParser == null) {
            defaultParser = new MyParserDelegator();
        }
        return defaultParser;
    }

    class MyHTMLFactory extends HTMLFactory implements ViewFactory {
        public MyHTMLFactory() {
            super();
        }

        @Override
        public View create(Element element) {
            HTML.Tag kind = (HTML.Tag) (element.getAttributes().getAttribute(javax.swing.text.StyleConstants.NameAttribute));

            if (kind instanceof HTML.UnknownTag && element.getName().equals("button")) {

                return new ComponentView(element) {
                    @Override
                    protected Component createComponent() {
                        JButton button = new JButton("Button : text unknown");

                        try {
                            int start = getElement().getStartOffset();
                            int end = getElement().getEndOffset();
                            String text = getElement().getDocument().getText(start, end - start);
                            button.setText(text);
                        } catch (BadLocationException e) {
                            e.printStackTrace();
                        }

                        return button;
                    }
                };

            }
            return super.create(element);
        }
    }
}

class MyHTMLDocument extends HTMLDocument {
    public MyHTMLDocument(StyleSheet styles) {
        super(styles);
    }

    @Override
    public HTMLEditorKit.ParserCallback getReader(int pos) {
        Object desc = getProperty(Document.StreamDescriptionProperty);
        if (desc instanceof URL) {
            setBase((URL) desc);
        }
        return new MyHTMLReader(pos);
    }

    class MyHTMLReader extends HTMLDocument.HTMLReader {
        public MyHTMLReader(int offset) {
            super(offset);
        }

        @Override
        public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
            if (t.toString().equals("button")) {
                registerTag(t, new BlockAction());
            }
            super.handleStartTag(t, a, pos);
        }
    }
}

class MyParserDelegator extends Parser {
    private DTD _dtd;

    public MyParserDelegator() {
        String nm = "html32";
        try {
            _dtd = DTD.getDTD(nm);
            createDTD(_dtd, nm);

            javax.swing.text.html.parser.Element div = _dtd.getElement("div");
            _dtd.defineElement("button", div.getType(), true, true, div.getContent(), null, null, div.getAttributes());
        } catch (IOException e) {
            // (PENDING) UGLY!
            System.out.println("Throw an exception: could not get default dtd: " + nm);
        }
    }

    protected static DTD createDTD(DTD dtd, String name) {
        InputStream in = null;
        try {
            String path = name + ".bdtd";
            in = ParserDelegator.class.getResourceAsStream(path);
            if (in != null) {
                dtd.read(new DataInputStream(new BufferedInputStream(in)));
                DTD.putDTDHash(name, dtd);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return dtd;
    }

    @Override
    public void parse(Reader r, ParserCallback cb, boolean ignoreCharSet) throws IOException {
        new DocumentParser(_dtd).parse(r, cb, ignoreCharSet);
    }
}