1:使用JEditorPane组件: JEditorPane的类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.text.JTextComponent --javax.swing.JEditorPane JEditorPane继承JTextComponent类,因此它也可以使用JTextComponent抽象类里面的方法。JEditorPane的最主要功能在于展 现不同类型的文件格式内容。JEditorPane支持的文件类型有三种:第一种是纯文本类型,其类型的表示法为"text/plain",这种类型 的文件就是我们最常使用的txt文件,这类型的文件可以用记事本或WordPad等文书编辑软件来编辑。第二种是RTF类型,其表示法 为"text/rtf",这种类型的文件特色是能对文字内容做字体缩放、变形、上色等特殊效果。第三类是HTML类型,也就是我们在网络上 所浏览的网页类型,其表示法为"text/html",这类文件的特色相信大家都非常的清楚,除了在对字体效果的表现之外还具有在文件 内加入图片、超级链接等相关功能。但是JEditorPane并不是一个全功能的Web Browser,它仅能支持简单的HTML语法.JEditorPane支 持HTML类型的文件最主要的用途是用来制作在线辅助说明文件。 JEditorPane构造函数: JEditorPane():建立一个新的JEditorPane. JEditorPane(String url):以详细的URL字符串为基础来建立一个JEditorPane。 JEditorPane(String type,String text):建立一个被指定字符串text并指定初始化JEditorPane的类型。 JEditorPane(URL initialPage):以详细的URL字符串当作输入值来建立一个JEditorPane. 1-1:构造JEditorPane组件: 我们将一个HTML文件放在构造完成的JEditPane中: import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.awt.event.*; public class JEditorPane1{ public static void main(String[] args){ JEditorPane editPane=null; try{ File file=new File("docs/JEditorPane_1.html"); String str=file.getAbsolutePath();//取得文件位置的绝对路径 str="file:"+str;//将绝对路径合成一完整的输入字符串 /*利用setPage()方法将字符串中路径所指的文件加载JEditorPane. *在setPage()方法中,输入的数据是String类型的字符串,其实这样的构造方式等同于利用JEditorPane的另一个构造函数 *JEditorPane(String str)来构造。因此如果我们将下面两行程序改写如下行: * editPane=new JEditorPane(str); *会得到相同的效果,所以我们就不再对此种构造方式再多加说明. */ editPane=new JEditorPane();//构造一个空的JEditorPane editPane.setPage(str); }catch(IOException ioe){ ioe.printStackTrace(System.err); System.exit(0); } /*利用setEditable()方法将JEditorPane设为不可编辑.请注意,这行是相当重要的,若是我们将这个方法设为true,我们将会 *失去HTML文件本身的特性,如超级链接的功能等等。因此我们在使用下面JEditorPane2的例子时,一般都会将编辑的功能取 *消(设置false).目前这个超级链接功能并没有作用,这部份将在JEditorPane的事件处理中介绍. */ editPane.setEditable(false); JFrame f=new JFrame("JEditorPane1"); f.setContentPane(new JScrollPane(editPane)); f.setSize(200,200); f.show(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } } 我们在前面提到JEditorPane支持三种类型的文件格式,在上面的例子里我们并没有看到设置文件格式的步骤,那是因为在上面 的构造方法中系统会依照输入文件名称来自动判别文件类型。若是我们想要自己设置文件类型可利用setContentType()方法,或是 直接在JEditorPane构造函数中设置。如下面这个范例: import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; public class JEditorPane2{ public static void main(String[] args){ String str=new String("This is a test.\nthis is Line2!\nThis is Line 3!"); JEditorPane editPane=new JEditorPane("text/plain",str); editPane.setEditable(false); JFrame f=new JFrame("JEditorPane2"); f.setContentPane(new JScrollPane(editPane)); f.pack(); f.show(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } } 以URL类当作JEditPane的参数来构造,但是要注意的地方是使用这种方式来构造里,计算机要连接上局域网络或网际网络不然 程序会找不到URL指定的位置而产生Exception使得程序无法动作.我们来看下面的范例吧! import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.net.*; import java.io.*; public class JEditorPane3{ public static void main(String[] args){ JEditorPane editPane=null; try{ URL address=new URL("http://www.sina.com.cn"); editPane=new JEditorPane(address); }catch(MalformedURLException e){ System.out.println("Malformed URL:"+e); }catch(IOException e){ System.out.println("IOException:"+e); } editPane.setEditable(false); JFrame f=new JFrame("JEditorPane3"); f.setContentPane(new JScrollPane(editPane)); f.setSize(200,250); f.show(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } } 1-2:JEditorPane的事件处理: 在JEditorPane文件中最常用到事件处理的部份就是HTML文件,那是因为HTML文件本身具有超级链接的功能来做文章链接的用途 。大家还记得我们这一节的第一个范例吗?我们不是加载了一份HTML文件到JEditorPane中吗?虽然画面上都有确实的将超级链接和 图片信息展现出来,可是你有没有发现当你想要点选超级链接的地方时却没有反应呢?那是因为我们并没有在JEditorPane中加入事 件处理机制的缘故。我们改写JEditorPane1.java加入事件处理机制,使JEditorPane具有正常的超链接功能。如下范例: import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.awt.event.*; public class JEditorPane4{ public static void main(String[] args){ JEditorPane editPane = null; try{ File thef = new File ("docs/JEditorPane_1.html"); String str = thef.getAbsolutePath(); str = "file:"+str; editPane = new JEditorPane(); editPane.setPage(str); } catch(IOException ioe){ ioe.printStackTrace(System.err); System.exit(0); } editPane.setEditable(false); final JEditorPane thePane = editPane; //采用inner class的方式编写触发超级链接事件时的对应操作类 editPane.addHyperlinkListener(new HyperlinkListener(){ public void hyperlinkUpdate(HyperlinkEvent hle){//覆写hyperlinkUpdate()方法,当超级链接事件触发时会进入这 //个区段运行. try{ //判断是否为超级链接运行操作。若操作为真,则将新的HTML文件放到JEditorPane中, //操作为(thePane.setPage(hle.getURL());) if (hle.getEventType() == HyperlinkEvent.EventType.ACTIVATED) } catch(IOException ioe){ ioe.printStackTrace(System.err); } } }); JFrame f = new JFrame("JEditorPane4"); f.setContentPane(new JScrollPane(editPane)); f.setSize(200,250); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }//end of main() }//end of class JEditPane1 另外,若是我们是在纯文字模式(Plain Text)或RTF模式(RTF Text)下需要事件处理模式又该怎么办呢?你还记得我们在 JTextArea中是如何加入事件处理模式的吗?没错!在JEditorPane中也是相同的做法,也就是利用DocumentListener interface的 机制来处理,由于做法相当类似,因此我们就不在这里重复的说明. 2:使用JTextPane组件: JTextPane的类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.text.JTextComponent --javax.swing.JEditorPane --javax.swing.JTextPane 我们在前面有介绍过JTextArea类,虽然JTextArea在某些功能上已经能够满足我们的需求,但是当我们想再加入更多的变化时 (如文字加入色彩、插入图片...)就会发现JTextArea类根本无法做到。要做到这些功能,我们必须使用JEditorPane的子类: JTextpane。JTextPane提供了许多对文字的处理,如改变颜色、字体缩放、文字风格、加入图片等。我们先来看看JTextPane的构 造方法: JTextPane构造函数: JTextPane():建立一个新的JTextPane. JTextPane(StyledDocument doc):以指定的文件模式建立一个新的JTextPane. 2-1:JTextPane的特性: 相信大家都有用过Word来写过报告或文章,那么你一定会知道我们在Word中可以对文章中的文字做很多的变化,这些变化都是 属于文字的“属性”变化。由于在JTextPane中产生的效果几乎都是由属性的变化而来,所以改变属性的类组件在JTextpane中是少 不了的。因此在介绍如何构造JTextPane之前,我们要先介绍两个在JTextPane中常用到属性类: SimpleAttributeSet和StyleConstant. 属性的变化原本是利用AttributeSet interface来处理的,但是这个interface中包含了太多的方法,若是我们直接实作 AttributeSet interface那就需要实作此interface里所有的方法,这对编写程序来说并不是一个很理想的做法;而java另外提供了 SimpleAttributeSet类,实作了AttributeSet interface.因此,只要我们直接使用SimpleAttributeSet类就能具备AttributeSet interface的所有功能,而不用一个个的编写AttributeSet中的方法。另外StyleConstant类则是提供AttributeSet类许多常用的属 性键值(Attribute Key)和方法来设置或取得JTextPane内容的状态。在StyleConstant类中包含了许多的常用的属性设置,包括本文 与边界空白区段设置、文字字体/大小/类型设置、背景颜色设置等。利用这两个类来辅助设计JTextPane便使JTextPane有更丰富 的内容变化。 JTextPane是专为文字和版面处理设计的组件。JTextPane对可输入区域内容的设计概念是一个类似Word的设计概念,也就是说在 JTextPane中的文字结构是有段落概念的。“段落”的概念就是以[Enter]键为每一段落的分界点,每按一次[Enter]键就增加一个段 落。记得我们在JTextArea中提过的Element存储模式吗?在JTextPane中也是采用相同的做法,但是差别在于规划存储的方式不同。 在JTextArea中并没有分段落,只是单纯的以[Enter]键当作存储成两个Element的分界。而在JTextPane则是以整个编辑区哉为根节 点,每个段落为枝节点 ,每个字符为叶节点来存储文件。也因为JTextPane是采用这样的方式来存储数据,因此在JTextPane中也可 以像Word文件一样将各个段落设置成不同的属性,如第一段为斜体字、字体大小为14号字、粗体字,第二段为斜体字、字体颜色为 蓝色、向左边界缩排2厘米等;另外,我们还可以设置JTextPane编辑区内输入的文字与各个边界间的距离。由这些功能看来,对于一 个TextComponent来说JTextPane是一个具有相当多实用功能的组件。 2-2:构造JTextPane组件: 在了解JTextPane的各项特性之后,我们现在马上来看JTextPane可以呈现什么样的效果,在下面这个例子中我们将对JTextPane 区域内的文字设置颜色、粗斜体、与底线等相关属性。 import javax.swing.*; import javax.swing.text.*; import java.awt.event.*; import java.awt.*; public class JTextPane1{ private JTextPane textPane; public JTextPane1(){ textPane=new JTextPane(); textPane.setBackground(Color.black); textPane.setEditable(false); } public void setYellow_Bold_20(String str){ SimpleAttributeSet attrset=new SimpleAttributeSet(); StyleConstants.setForeground(attrset,Color.yellow); StyleConstants.setBold(attrset,true); insert(str,attrset); } public void setBlue_Italic_Bold_22(String str){ SimpleAttributeSet attrset=new SimpleAttributeSet(); StyleConstants.setForeground(attrset,Color.blue); StyleConstants.setItalic(attrset,true); StyleConstants.setFontSize(attrset,24); insert(str,attrset); } public void setRed_UnderLine_Italic_24(String str){ SimpleAttributeSet attrset=new SimpleAttributeSet(); StyleConstants.setForeground(attrset,Color.red); StyleConstants.setUnderline(attrset,true); StyleConstants.setItalic(attrset,true); StyleConstants.setFontSize(attrset,24); insert(str,attrset); } //这个方法最主要的用途是将字符串插入到JTextPane中。 public void insert(String str,AttributeSet attrset){ Document docs=textPane.getDocument();//利用getDocument()方法取得JTextPane的Document instance.0 str=str+"\n"; try{ docs.insertString(docs.getLength(),str,attrset); }catch(BadLocationException ble){ System.out.println("BadLocationException:"+ble); } } public Component getComponent(){ return textPane; } public static void main(String[] args){ JTextPane1 pane=new JTextPane1(); pane.setYellow_Bold_20("This is Line 1,yellow,Bold,Size 20"); pane.setBlue_Italic_Bold_22("This is Line 2,blue,Italic,Bold,Size 22"); pane.setRed_UnderLine_Italic_24("This is Line 3,red,UnderLine,Italic,Size 24"); JFrame f=new JFrame("JTextPane1"); f.getContentPane().add(pane.getComponent()); f.setSize(450,180); f.show(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } } 若你想在JTextPane上置入图形或其他组件(如表格或按钮),你可以分别使用JTextPane所提供的insetIcon()与insertComponent() 方法来达到这个效果。 至于另外一种JTextPane的构造方式和JTextArea一样,差别在于JTextArea是采用Document interface而JTextPane是采用 (责任编辑:机器AI) |