📄 s21.htm
字号:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都网--Java 2 图形设计卷Ⅱ:SWING</title><LINK rel="stylesheet" href="../../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,网络安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%"> <tbody> <script language="javascript">print2()</script> <tr> <td width="100%"> <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%"> <tbody> <tr> <td class=f1 id=thetd width="100%"> <p>[<a href="index.html" target="_self">目录</a>][<a href="s20.htm">上一页</a>][<a href="s22.htm">下一页</a>]</p> <p align="center"><b>第21章 文本基础</b></p> <p> Swing文本组件是相对比较简单的组件。它建立在由javax.swing.text包的类和接口提供的一个复杂的下层构件之上。本书将分三章来介绍Swing文本。本章主要讨论所有文本组件从JTextComponent类继承的基本功能。在第22章的“文本组件”中将讨论这些文本组件。在第23章的“定制文本组件”中将讨论Swing文本的更高级的主题,如视图、元素、属性集和风格。</p> <p> <b>21.1 Swing文本组件</b></p> <p> </p> <p> 21.2 动作</p> <p> </p> <p> 21.2.1 文本动作</p> <p align="center"><b>例21-1 使用文本组件动作</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 java.util.*; <p>public class Test extends JFrame {<br> private JTextArea textArea = createTextArea();<br> private Action[] actions = textArea.getActions();</p> <p> private JList actionList = createActionList(actions);<br> private JSplitPane splitPane = new JSplitPane(<br> JSplitPane.HORIZONTAL_SPLIT, <br> new JScrollPane(textArea),<br> new JScrollPane(actionList));<br> public Test() {<br> Container contentPane = getContentPane();</p> <p> splitPane.setDividerLocation(150);</p> <p> contentPane.add(splitPane, BorderLayout.CENTER);<br> contentPane.add(GJApp.getStatusArea(), <br> BorderLayout.SOUTH);</p> <p> }<br> private JList createActionList(Action[] actions) {<br> DefaultListModel model = new DefaultListModel();<br> final JList list = new JList(model);</p> <p> list.setSelectionMode(<br> ListSelectionModel.SINGLE_SELECTION);</p> <p> for(int i=0; i < actions.length; ++i) {<br> model.addElement(actions[i]);<br> }</p> <p> list.setCellRenderer(new DefaultListCellRenderer() {<br> public Component getListCellRendererComponent(<br> JList list, Object value,<br> int index, boolean isSelected,<br> boolean cellHasFocus) {<br> super.getListCellRendererComponent(list, value,<br> index, isSelected, cellHasFocus);</p> <p> Action action = (Action)value;<br> setText((String)action.getValue(Action.NAME));</p> <p> return this;<br> }<br> });<br> list.addListSelectionListener(new ListSelectionListener(){<br> public void valueChanged(ListSelectionEvent e) {<br> if(!e.getValueIsAdjusting()) {<br> Action source = <br> (Action)actionList.getSelectedValue();</p> <p> textArea.requestFocus();<br> source.actionPerformed(null);</p> <p> GJApp.showStatus("Action: " + <br> (String)source.getValue(Action.NAME));<br> }<br> }<br> });</p> <p> return list;<br> }<br> private JTextArea createTextArea() {<br> JTextArea textArea = new JTextArea(<br> "line one\nline two\nline three\nline four");</p> <p> textArea.setFont(new Font("Dialog", Font.ITALIC, 24));<br> textArea.getCaret().setBlinkRate(0);<br> return textArea;<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(), <br> "Text Component Actions",300,300,450,300);<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.2.2 动作和编辑工作包</p> <p> </p> <p align="center"><b>例21-2 用缺省编辑工具包访问动作</b></p> <hr noshade size="1"> import java.awt.*;<br> import javax.swing.*;<br> import javax.swing.text.*;<br> import java.util.*; <p>public class Test extends JApplet {<br> private JTextArea textArea = new JTextArea("some content");<br> private Hashtable actionTable = new Hashtable();</p> <p> public Test() {<br> Container contentPane = getContentPane();</p> <p> textArea.setFont(new Font("Dialog", Font.PLAIN, 24));</p> <p> loadActionTable();</p> <p> setJMenuBar(createMenu());<br> contentPane.add(textArea, BorderLayout.CENTER);<br> }<br> private void loadActionTable() {<br> Action[] actions = textArea.getActions();</p> <p> for(int i=0; i < actions.length; ++i) {<br> actionTable.put(actions[i].getValue(Action.NAME),<br> actions[i]);<br> }<br> }<br> private Action getAction(String name) {<br> return (Action)actionTable.get(name);<br> }<br> private JMenuBar createMenu() {<br> JMenuBar menuBar = new JMenuBar();<br> JMenu editMenu = new JMenu("Edit");</p> <p> editMenu.add(getAction(DefaultEditorKit.cutAction));<br> editMenu.add(getAction(DefaultEditorKit.copyAction));<br> editMenu.add(getAction(DefaultEditorKit.pasteAction));</p> <p> menuBar.add(editMenu);<br> return menuBar;<br> }<br> }</p> <hr size="1" noshade> <p> 21.3 键映射</p> <p> </p> <p align="center"><b>例21-3 设置键映射</b></p> <hr noshade size="1"> import javax.swing.*;<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> private JTextArea textArea = new JTextArea("initial content");<br> private JCheckBox cbox = new JCheckBox("keymap added");<br> private Hashtable actionTable = new Hashtable();<br> private Keymap originalKeymap, newKeymap;</p> <p> public void init() {<br> Container contentPane = getContentPane();</p> <p> loadActionTable();<br> originalKeymap = textArea.getKeymap();<br> newKeymap = createKeymap();</p> <p> textArea.setFont(new Font("Dialog", Font.PLAIN, 24));</p> <p> contentPane.add(new ControlPanel(), BorderLayout.NORTH);<br> contentPane.add(textArea, BorderLayout.CENTER);<br> }<br> private Keymap createKeymap() {<br> Keymap map = JTextComponent.addKeymap("applet keymap",<br> textArea.getKeymap());</p> <p> KeyStroke forwardKeyStroke = <br> KeyStroke.getKeyStroke(KeyEvent.VK_F,<br> InputEvent.ALT_MASK),<br> backwardKeyStroke =<br> KeyStroke.getKeyStroke(KeyEvent.VK_B,<br> InputEvent.ALT_MASK);<br> Action forwardAction =<br> getAction(DefaultEditorKit.forwardAction),<br> backwardAction =<br> getAction(DefaultEditorKit.backwardAction);</p> <p> map.addActionForKeyStroke(forwardKeyStroke,<br> forwardAction);<br> map.addActionForKeyStroke(backwardKeyStroke,<br> backwardAction);<br> return map;<br> }<br> private void loadActionTable() {<br> Action[] actions = textArea.getActions();</p> <p> for(int i=0; i < actions.length; ++i) {<br> actionTable.put(actions[i].getValue(Action.NAME),<br> actions[i]);<br> }<br> }<br> private Action getAction(String name) {<br> return (Action)actionTable.get(name);<br> }<br> class ControlPanel extends JPanel {<br> public ControlPanel() {<br> add(cbox);</p> <p> cbox.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> textArea.setKeymap(cbox.isSelected() ?<br> newKeymap : <br> originalKeymap);</p> <p> textArea.requestFocus();<br> }<br> });<br> }<br> }<br> }</p> <hr size="1" noshade> <p> 21.4 文档</p> <p> </p> <p> 21.4.1 定制文档</p> <p> </p> <p align="center"><b>例21-4 只可以输入整数的文档</b></p> <hr noshade size="1"> import javax.swing.*;<br> import javax.swing.text.*;<br> import java.awt.*;<br> import java.awt.event.*; <p>public class Test extends JApplet {<br> JTextField tf = new JTextField(3);</p> <p> public Test() {<br> Container contentPane = getContentPane();<br> JLabel label = new JLabel("Enter an Integer:");</p> <p> tf.setDocument(new IntegerDocument());<br> <br> contentPane.setLayout(new FlowLayout()); <br> contentPane.add(label);<br> contentPane.add(tf);<br> }<br> }<br> class IntegerDocument extends PlainDocument {<br> public void insertString(int offset, String s, <br> AttributeSet attributeSet) <br> throws BadLocationException {<br> try {<br> Integer.parseInt(s);<br> }<br> catch(Exception ex) { // only allow integer values<br> Toolkit.getDefaultToolkit().beep();<br> return; <br> }<br> super.insertString(offset, s, attributeSet);<br> }<br> }</p> <hr size="1" noshade> <p> 21.4.2 文档监听器</p> <p> </p> <p align="center"><b>例21-5 使用文档监听器</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 java.util.*;<br> import java.io.*; <p>public class Test extends JFrame {<br> private JTextArea textArea = new JTextArea();<br> private Document document = textArea.getDocument();<br> private DefaultEditorKit kit = new DefaultEditorKit();<br> private Action saveAction = new AbstractAction() { <br> public void actionPerformed(ActionEvent e) {<br> String s = JOptionPane.showInputDialog(<br> Test.this,<br> "Enter Filename:");<br> if(s != null) {<br> try {<br> kit.write(new FileWriter(s), <br> document, 0, <br> document.getLength());<br> }<br> catch(Exception ex) {<br> ex.printStackTrace();<br> }<br> }<br> }<br> };</p> <p> public Test() {<br> Container contentPane = getContentPane();</p> <p> try {<br> kit.read(new FileReader("Test.java"), document, 0);<br> }<br> catch(Exception ex) {<br> ex.printStackTrace();<br> }</p> <p> final JTextArea status = new JTextArea();<br> JPanel p = new JPanel();<br> JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, <br> p, status);<br> sp.setDividerLocation(200);</p> <p> saveAction.putValue(Action.NAME, "Save ...");<br> saveAction.setEnabled(false);</p> <p> p.setLayout(new BorderLayout()); <br> p.add(new JScrollPane(textArea), BorderLayout.CENTER);</p> <p> contentPane.add(sp, BorderLayout.CENTER);</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -