📄 s21.htm
字号:
<p> textArea.getDocument().addDocumentListener(<br> new DocumentListener() {<br> public void insertUpdate(DocumentEvent e) {<br> saveAction.setEnabled(true);<br> updateStatus(e);<br> }<br> public void removeUpdate(DocumentEvent e) {<br> saveAction.setEnabled(true);<br> updateStatus(e);<br> }<br> public void changedUpdate(DocumentEvent e) {<br> saveAction.setEnabled(true);<br> updateStatus(e);<br> }<br> private void updateStatus(DocumentEvent e) {<br> status.append(e.getType().toString());<br> status.append(" Offset: " + e.getOffset());<br> status.append(" Length: " + e.getLength() + "\n");<br> }<br> });</p> <p> setJMenuBar(createMenuBar());<br> }<br> private JMenuBar createMenuBar() {<br> JMenuBar menuBar = new JMenuBar();<br> JMenu editMenu = new JMenu("Edit");</p> <p> editMenu.add(new DefaultEditorKit.CutAction());<br> editMenu.add(new DefaultEditorKit.CopyAction());<br> editMenu.add(new DefaultEditorKit.PasteAction());<br> editMenu.addSeparator();<br> editMenu.add(saveAction);</p> <p> menuBar.add(editMenu);<br> return menuBar;<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(), <br> "Using Document Listeners",<br> 300,300,650,500);<br> }<br> }<br> class GJApp extends WindowAdapter {<br> static private JPanel statusArea = new JPanel();<br> static private JLabel status = new JLabel(" ");<br> static private ResourceBundle resources;</p> <p> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> launch(f,title,x,y,w,h,null); <br> }<br> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h,<br> String propertiesFilename) {<br> f.setTitle(title);<br> f.setBounds(x,y,w,h);<br> f.setVisible(true);</p> <p> statusArea.setBorder(BorderFactory.createEtchedBorder());<br> statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));<br> statusArea.add(status);<br> status.setHorizontalAlignment(JLabel.LEFT);</p> <p> f.setDefaultCloseOperation(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> if(propertiesFilename != null) {<br> resources = ResourceBundle.getBundle(<br> propertiesFilename, Locale.getDefault());<br> }</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> static public JPanel getStatusArea() {<br> return statusArea;<br> }<br> static public void showStatus(String s) {<br> status.setText(s);<br> }<br> static Object getResource(String key) {<br> if(resources != null) {<br> return resources.getString(key);<br> }<br> return null;<br> }<br> }</p> <hr size="1" noshade> <p> 21.5 加字符与加重器</p> <p> </p> <p> 21.5.1 加字符</p> <p> </p> <p> 21.5.2 加字符监听器</p> <p> </p> <p align="center"><b>例21-6 实现一个加字符监听器</b></p> <hr noshade size="1"> import java.awt.*;<br> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.text.*; <p>public class Test extends JApplet {<br> public Test() {<br> Container contentPane = getContentPane();<br> JTextArea textArea = new JTextArea();</p> <p> contentPane.add(textArea, BorderLayout.CENTER);</p> <p> textArea.setFont(new Font("Dialog", Font.PLAIN, 24));</p> <p> textArea.addCaretListener(new CaretListener() {<br> public void caretUpdate(CaretEvent e) {<br> showStatus("Mark: " + e.getMark() +<br> " / Dot: " + e.getDot());<br> }<br> });<br> }<br> }</p> <hr size="1" noshade> <p> 21.5.3 定制加字符</p> <p> </p> <p align="center"><b>例21-7 实现一个定制加字符</b></p> <hr noshade size="1"> import javax.swing.*;<br> import javax.swing.plaf.*;<br> import javax.swing.text.*;<br> import java.awt.*;<br> import java.awt.event.*;<br> import java.util.*; <p>public class Test extends JApplet {<br> public Test() {<br> Container contentPane = getContentPane();<br> JTextArea textArea = new JTextArea();</p> <p> textArea.setCaret(new TriangleCaret(8));<br> textArea.setFont(new Font("Dialog", Font.ITALIC, 24));<br> contentPane.add(textArea, BorderLayout.CENTER);<br> }<br> }<br> class TriangleCaret extends DefaultCaret {<br> private int triangleWidth, left, right, top, bottom, middle;</p> <p> public TriangleCaret(int triangleWidth) {<br> this.triangleWidth = triangleWidth;<br> }<br> public void paint(Graphics g) {<br> if(isVisible()) {<br> try {<br> JTextComponent comp = getComponent();<br> Rectangle r = comp.modelToView(getDot());</p> <p> setLocations(r);<br> g.setColor(comp.getCaretColor());</p> <p> g.drawLine(left, bottom, middle, top);<br> g.drawLine(middle, top, right, bottom);<br> g.drawLine(right, bottom, left, bottom);<br> }<br> catch(BadLocationException ex) {<br> ex.printStackTrace();<br> }<br> }<br> }<br> protected synchronized void damage(Rectangle r) {<br> if(r != null) {<br> setLocations(r);<br> x = left;<br> y = top;<br> width = right - left + 1;<br> height = bottom - top + 1;<br> }<br> }<br> private void setLocations(Rectangle r) {<br> left = r.x - triangleWidth/2; <br> right = r.x + triangleWidth/2;<br> bottom = r.y + r.height - 1; <br> top = bottom - triangleWidth;<br> middle = r.x;</p> <p> repaint();<br> }<br> }</p> <hr size="1" noshade> <p> 21.5.4 加重器</p> <p> </p> <p align="center"><b>例21-8 一个定制的加重器</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*;<br> import javax.swing.text.*; <p>public class Test extends JApplet {<br> public Test() {<br> Container contentPane = getContentPane();<br> JTextArea textArea = new JTextArea(<br> "File choosers, like option panes, are lightweight\n" +<br> "components that\n" +<br> "are meant to be placed ...");</p> <p> textArea.setCaret(new BoxHighlightingCaret());<br> textArea.setFont(new Font("Dialog", Font.ITALIC, 24));</p> <p> contentPane.add(new JScrollPane(textArea), <br> BorderLayout.CENTER);<br> }<br> }<br> class BoxHighlightingCaret extends DefaultCaret {<br> private static BoxHighlighterPainter painter = <br> new BoxHighlighterPainter(null);</p> <p> public Highlighter.HighlightPainter getSelectionPainter(){<br> return painter;<br> }<br> static class BoxHighlighterPainter <br> extends DefaultHighlighter.DefaultHighlightPainter {<br> private Color color;</p> <p> public BoxHighlighterPainter(Color color) {<br> super(color);<br> this.color = color;<br> }<br> public Shape paintLayer(Graphics g, int p0, int p1, <br> Shape shape, JTextComponent comp,<br> View view) {<br> Rectangle b = shape.getBounds();</p> <p> try {<br> g.setColor(getColor(comp));</p> <p> Rectangle r1 = comp.modelToView(p0);<br> Rectangle r2 = comp.modelToView(p1);</p> <p> g.drawRect(r1.x, r1.y, // x,y<br> r2.x - r1.x - 1, // width<br> r1.height - 1); // height<br> }<br> catch(BadLocationException ex) {<br> ex.printStackTrace();<br> }<br> return b;<br> }<br> private Color getColor(JTextComponent comp) {<br> return color != null ? color : <br> comp.getSelectionColor();<br> }<br> }<br> }</p> <hr size="1" noshade> <p> 21.6 撤销/恢复</p> <p> </p> <p align="center"><b>例21-9 一个撤消和恢复的实现</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.text.*;<br> import javax.swing.undo.*; <p>public class Test extends JApplet {<br> private JTextArea textArea = new JTextArea("some content");<br> private Document document = textArea.getDocument();<br> private UndoManager undoManager = new UndoManager();<br> private UndoLastAction undoAction = new UndoLastAction();<br> private RedoAction redoAction = new RedoAction();</p> <p> public Test() {<br> Container contentPane = getContentPane();</p> <p> createMenu();<br> contentPane.add(textArea, BorderLayout.CENTER);</p> <p> textArea.setFont(new Font("Dialog", Font.PLAIN, 24));<br> document.addUndoableEditListener(<br> new UndoableEditListener() {<br> public void undoableEditHappened(UndoableEditEvent e){<br> undoManager.addEdit(e.getEdit());<br> undoAction.update();<br> redoAction.update();<br> }<br> });<br> }<br> private void createMenu() {<br> JMenuBar menuBar = new JMenuBar();<br> JMenu editMenu = new JMenu("Edit");</p> <p> editMenu.add(new DefaultEditorKit.CutAction());<br> editMenu.add(new DefaultEditorKit.CopyAction());<br> editMenu.add(new DefaultEditorKit.PasteAction());</p> <p> editMenu.addSeparator();</p> <p> editMenu.add(undoAction);<br> editMenu.add(redoAction);</p> <p> menuBar.add(editMenu);<br> setJMenuBar(menuBar);<br> }<br> class RedoAction extends AbstractAction {<br> public RedoAction() {<br> super("Redo");<br> update();<br> }<br> public void actionPerformed(ActionEvent e) {<br> undoManager.redo();<br> undoAction.update();<br> update();<br> }<br> public void update() {<br> boolean canRedo = undoManager.canRedo();</p> <p> if(canRedo) {<br> setEnabled(true);<br> putValue(Action.NAME, <br> undoManager.getRedoPresentationName());<br> }<br> else {<br> setEnabled(false);<br> putValue(Action.NAME, "Redo");<br> }<br> }<br> }<br> class UndoLastAction extends AbstractAction {<br> public UndoLastAction() {<br> super("Undo");<br> update();<br> }<br> public void actionPerformed(ActionEvent e) {<br> undoManager.undo();<br> redoAction.update();<br> update();<br> }<br> public void update() {<br> boolean canUndo = undoManager.canUndo();</p> <p> if(canUndo) {<br> setEnabled(true);<br> putValue(Action.NAME, <br> undoManager.getUndoPresentationName());<br> }<br> else {<br> setEnabled(false);<br> putValue(Action.NAME, "Undo");<br> }<br> }<br> }<br> }</p> <hr size="1" noshade> <p> 21.7 JTextComponent</p> <p> </p> <p> 21.8 本章回顾</p> <p> </p> <p>[<a href="index.html" target="_self">目录</a>][<a href="s20.htm">上一页</a>][<a href="s22.htm">下一页</a>](飒龙收藏/2002.5.18) </p> </td> </tr> </tbody> </table> </td> </tr></tbody></table><script language="javascript">bottomprint()</script></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -