📄 s06.htm
字号:
putValue(Action.NAME,<br> undo.getUndoPresentationName());<br> }<br> }<br> }<br> class BackgroundColorEdit extends AbstractUndoableEdit {<br> public void undo() throws CannotUndoException {<br> super.undo();<br> toggleColor();<br> }<br> public void redo() throws CannotRedoException {<br> super.redo();<br> toggleColor();<br> }<br> public String getUndoPresentationName() {<br> return "Undo";<br> }<br> public String getRedoPresentationName() {<br> return "Redo";<br> }<br> private void toggleColor() {<br> Color color = colorPanel.getBackground();<br> colorPanel.setBackground(oldColor);<br> oldColor = color;<br> }<br> }<br> }</p> <hr noshade size="1"> <p> 6.7.2 UndoableEditSupport</p> <p> </p> <p align="center"><b>例6-13 使用UndoableEditSupport</b></p> <hr noshade size="1"> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.undo.*;<br> import java.awt.*;<br> import java.awt.event.*; <p>public class Test extends JApplet {<br> private ColorPanel colorPanel = new ColorPanel();<br> private UndoAction undoAction = new UndoAction();</p> <p> public void init() {<br> colorPanel.setBorder(<br> BorderFactory.createTitledBorder(<br> "Change color and subsequently undo " +<br> "from the Edit menu"));</p> <p> makeMenuBar();<br> colorPanel.addUndoableEditListener(undoAction);<br> getContentPane().add(colorPanel, BorderLayout.CENTER);<br> }<br> private void makeMenuBar() {<br> JMenuBar menuBar = new JMenuBar();<br> JMenu editMenu = new JMenu("Edit");</p> <p> editMenu.add(new SetColorAction());<br> editMenu.add(undoAction);</p> <p> menuBar.add(editMenu);<br> setJMenuBar(menuBar);<br> }<br> class UndoAction extends AbstractAction <br> implements UndoableEditListener {<br> UndoableEdit lastEdit;</p> <p> public UndoAction() {<br> putValue(Action.NAME, "Undo");<br> setEnabled(false);<br> }<br> public void actionPerformed(ActionEvent e) {<br> String name = (String)getValue(Action.NAME);<br> boolean isUndo = name.equals(<br> lastEdit.getUndoPresentationName());<br> if(isUndo) {<br> lastEdit.undo(); <br> putValue(Action.NAME,<br> lastEdit.getRedoPresentationName());<br> }<br> else {<br> lastEdit.redo(); <br> putValue(Action.NAME,<br> lastEdit.getUndoPresentationName());<br> }<br> }<br> public void undoableEditHappened(UndoableEditEvent e) {<br> lastEdit = e.getEdit();</p> <p> putValue(Action.NAME, <br> lastEdit.getUndoPresentationName());</p> <p> if(lastEdit.canUndo())<br> setEnabled(true);<br> }<br> }<br> class SetColorAction extends AbstractAction {<br> public SetColorAction() {<br> super("Set color ...");<br> }<br> public void actionPerformed(ActionEvent e) {<br> Color color = JColorChooser.showDialog(<br> Test.this, // parent component<br> "Pick A Color", // dialog title<br> null); // initial color</p> <p> if(color != null) { <br> colorPanel.setBackground(color);<br> }<br> }<br> }<br> }<br> class ColorPanel extends JPanel {<br> UndoableEditSupport support;<br> BackgroundColorEdit edit = new BackgroundColorEdit();<br> Color oldColor;</p> <p> public void addUndoableEditListener(<br> UndoableEditListener l) {<br> support.addUndoableEditListener(l);<br> }<br> public void removeUndoableEditListener(<br> UndoableEditListener l) {<br> support.removeUndoableEditListener(l);<br> }<br> public void setBackground(Color color) {<br> oldColor = getBackground();<br> super.setBackground(color);</p> <p> if(support == null)<br> support = new UndoableEditSupport();</p> <p> support.postEdit(edit);<br> }<br> class BackgroundColorEdit extends AbstractUndoableEdit {<br> public void undo() throws CannotUndoException {<br> super.undo();<br> toggleColor();<br> }<br> public void redo() throws CannotRedoException {<br> super.redo();<br> toggleColor();<br> }<br> public String getUndoPresentationName() {<br> return "Undo Background Color Change";<br> }<br> public String getRedoPresentationName() {<br> return "Redo Background Color Change";<br> }<br> private void toggleColor() {<br> Color color = getBackground();<br> setBackground(oldColor);<br> oldColor = color;<br> }<br> }<br> }</p> <hr noshade size="1"> <p> 6.7.3 组合编辑</p> <p> </p> <p align="center"><b>例6-14 使用组合编辑</b></p> <hr noshade size="1"> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.undo.*;<br> import java.awt.*;<br> import java.awt.event.*; <p>public class Test extends JApplet {<br> private UndoableList list = new UndoableList();<br> private JScrollPane scrollPane = new JScrollPane(list);</p> <p> private JButton addButton = new JButton("Add Item"),<br> endButton = new JButton("End"),<br> undoButton = new JButton("Undo");</p> <p> private UndoAction undoAction = new UndoAction();<br> private CompoundEdit compoundEdit = new CompoundEdit();<br> private int cnt=0;</p> <p> public void init() {<br> Container contentPane = getContentPane();</p> <p> contentPane.setLayout(new FlowLayout());<br> contentPane.add(addButton);<br> contentPane.add(endButton);<br> contentPane.add(undoButton);<br> contentPane.add(scrollPane);</p> <p> scrollPane.setPreferredSize(new Dimension(150,150));<br> list.addUndoableEditListener(undoAction);</p> <p> endButton.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> compoundEdit.end();<br> updateButtonsEnabledState();<br> }<br> });<br> addButton.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> list.undoableAdd("item #" + cnt++);<br> updateButtonsEnabledState();<br> }<br> });<br> undoButton.addActionListener(undoAction);</p> <p> endButton.setEnabled(false);<br> undoButton.setEnabled(false);<br> }<br> private void updateButtonsEnabledState() {<br> boolean inProgress = compoundEdit.isInProgress();</p> <p> endButton.setEnabled(inProgress);<br> addButton.setEnabled(inProgress);</p> <p> if(undoButton.getText().equals("Undo"))<br> undoButton.setEnabled(compoundEdit.canUndo());<br> else<br> undoButton.setEnabled(compoundEdit.canRedo());<br> }<br> class UndoAction extends AbstractAction <br> implements UndoableEditListener {</p> <p> public UndoAction() {<br> putValue(Action.NAME, "Undo");<br> }<br> public void actionPerformed(ActionEvent e) {<br> String name = undoButton.getText();<br> boolean isUndo = name.equals("Undo");</p> <p> if(isUndo) compoundEdit.undo(); <br> else compoundEdit.redo(); </p> <p> undoButton.setText(isUndo ? "Redo" : "Undo");<br> }<br> public void undoableEditHappened(UndoableEditEvent e) {<br> UndoableEdit edit = e.getEdit();<br> compoundEdit.addEdit(edit);<br> endButton.setEnabled(true);<br> }<br> }<br> }<br> class UndoableList extends JList {<br> UndoableEditSupport support = new UndoableEditSupport();<br> DefaultListModel model;</p> <p> public UndoableList() {<br> setModel(model = new DefaultListModel());<br> }<br> public void addUndoableEditListener(UndoableEditListener l) {<br> support.addUndoableEditListener(l);<br> }<br> public void removeUndoableEditListener(<br> UndoableEditListener l) {<br> support.removeUndoableEditListener(l);<br> }<br> public void undoableAdd(Object s) {<br> model.addElement(s);<br> support.postEdit(new AddItemEdit());<br> }<br> class AddItemEdit extends AbstractUndoableEdit {<br> Object lastItemAdded;</p> <p> public void undo() throws CannotUndoException {<br> super.undo();<br> lastItemAdded = model.getElementAt(model.getSize()-1);<br> model.removeElement(lastItemAdded);<br> }<br> public void redo() throws CannotRedoException {<br> super.redo();<br> model.addElement(lastItemAdded);<br> }<br> }<br> }</p> <hr noshade size="1"> <p> 6.7.4 UndoManager</p> <p> </p> <p> 6.7.5 状态编辑</p> <p> </p> <p align="center"><b>例6-15 使用状态编辑</b></p> <hr noshade size="1"> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.undo.*;<br> import java.awt.*;<br> import java.awt.event.*;<br> import java.util.*; <p>public class Test extends JApplet {<br> private TextFieldPanel panel = new TextFieldPanel();<br> private StateEdit stateEdit;</p> <p> private JButton startButton = new JButton("Start Edit"),<br> endButton = new JButton("End Edit"),<br> undoButton = new JButton("Undo");</p> <p> public void init() {<br> Container contentPane = getContentPane();</p> <p> contentPane.setLayout(new FlowLayout());<br> contentPane.add(startButton);<br> contentPane.add(endButton);<br> contentPane.add(undoButton);<br> contentPane.add(panel);</p> <p> endButton.setEnabled(false);<br> undoButton.setEnabled(false);</p> <p> startButton.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> stateEdit = new StateEdit(panel);<br> endButton.setEnabled(true);<br> startButton.setEnabled(false);<br> }<br> });<br> endButton.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> stateEdit.end();<br> undoButton.setEnabled(true);<br> endButton.setEnabled(false);<br> }<br> });<br> undoButton.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> String name = undoButton.getText();<br> boolean isUndo = name.equals("Undo");</p> <p> if(isUndo) stateEdit.undo(); <br> else stateEdit.redo(); </p> <p> undoButton.setText(isUndo ? "Redo" : "Undo");<br> }<br> });<br> }<br> }<br> class TextFieldPanel extends JPanel implements StateEditable {<br> JTextField[] fields = new JTextField[] {<br> new JTextField("text field 1"), <br> new JTextField("text field 2"),<br> new JTextField("text field 3"), <br> new JTextField("text field 4"),<br> };</p> <p> public TextFieldPanel() {<br> setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));</p> <p> for(int i=0; i < fields.length; ++i)<br> add(fields[i]);<br> }<br> public void storeState(Hashtable hashtable) {<br> for(int i=0; i < fields.length; ++i)<br> hashtable.put(fields[i], fields[i].getText());<br> }<br> public void restoreState(Hashtable hashtable) {<br> Enumeration keys = hashtable.keys();</p> <p> while(keys.hasMoreElements()) {<br> JTextField field = (JTextField)keys.nextElement();<br> field.setText((String)hashtable.get(field));<br> }<br> }<br> }</p> <hr noshade size="1"> <p> 6.8 本章回顾</p> <p> </p> <p> [<a href="index.html" target="_self">目录</a>][<a href="s05.htm">上一页</a>][<a href="s07.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 + -