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 <button> 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 <button> 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);
}
}