zoukankan      html  css  js  c++  java
  • JTextPane 的 undo 、 redo

    实现文本框输入内容的单条记录撤销,重做,通过按钮实现

    以及通过JList的多条撤销、重做操作(类似PS)

    昨天还在为自己写不出代码怎么办而伤心,没想到今天上午就实现了,并且还完善了功能:

    可以在撤销一些操作后,继续编辑文本框,同时给Jlist添加渲染。

    代码如下:

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package UndoText;
    
    import com.sun.media.sound.ModelAbstractChannelMixer;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.Action;
    import javax.swing.BorderFactory;
    import javax.swing.DefaultListCellRenderer;
    
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.JToolBar;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.UndoableEditEvent;
    import javax.swing.event.UndoableEditListener;
    import javax.swing.undo.UndoManager;
    import javax.swing.undo.UndoableEdit;
    
    /**
     *
     * @author Administrator
     */
    //实现文本框的撤销、重做
    public class UndoTextFrame extends JFrame {
    
        JPanel undoListJPanel = new JPanel();
        JList undoList = new JList();
        JScrollPane undoScrollPane = new JScrollPane(undoList);
        DefaultListModel listModel = new DefaultListModel<>();
        UndoManager um = new UndoManager();
        int[] undoIndexs;
        int indexF, indexS;
    
        public UndoTextFrame() {
            setTitle("sample");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(new BorderLayout());
            setSize(640, 480);
            setLocationRelativeTo(this);
            getContentPane().add(new textPanel(), BorderLayout.CENTER);
            getContentPane().add(undoListPanel(), BorderLayout.WEST);
    
        }
    
        public JPanel undoListPanel() {
            undoListJPanel.setLayout(new BorderLayout());
            undoList.setModel(listModel);
            undoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            undoList.setFixedCellWidth(100); // undoIndexs = new int[indexS];
    
    
            undoScrollPane.setPreferredSize(new Dimension(100, 400));
            undoScrollPane.setBorder(BorderFactory.createTitledBorder("Undo"));
            undoScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            undoScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            undoListJPanel.add(undoScrollPane, BorderLayout.NORTH);
            UndoListManager();
            return undoListJPanel;
    
        }
    
        public void UndoListManager() {
    
    
    
            undoList.addListSelectionListener(new ListSelectionListener() {
                @Override
                public void valueChanged(ListSelectionEvent lse) {
                    System.out.println("F:" + indexF);
                    System.out.println("S:" + indexS);
                    if (undoList.getValueIsAdjusting()) {
                        indexS = undoList.getSelectedIndex();
                    } else {
                        indexF = undoList.getSelectedIndex();
                    }
                    undoIndexs = new int[undoList.getLastVisibleIndex()];
                    for (int j = 0; j < indexS; j++) {
                        undoIndexs[j] = undoList.getSelectedIndex();
                    }
                    MyRenderer renderer = new MyRenderer(undoIndexs, Color.PINK);
                    undoList.setCellRenderer(renderer);
    
    
                    if (indexF < indexS) {
                        for (int i = indexF; i < indexS; i++) {
                            if (um.canRedo()) {
                                um.redo();
                            }
                        }
                    } else if (indexF > indexS) {
                        for (int i = indexF; i > indexS; i--) {
                            if (um.canUndo()) {
                                um.undo();
                            }
    
                        }
                    }
                }
            });
        }
    
        //quesion:textPane setLineCrap
        class textPanel extends JPanel {
    
            private JTextPane textPane = new JTextPane();
            private JScrollPane scrollTextPane1 = new JScrollPane(textPane);
            // private JLabel textTitle = new JLabel("TextPane");
            JPanel header = new JPanel();
            JToolBar toolBar = new JToolBar();
            JButton undoButton = new JButton("undo");
            JButton redoButton = new JButton("redo");
    
            public textPanel() {
                setLayout(new BorderLayout());
                textPane.setEditable(true);
                textPane.setToolTipText("textPane");
                scrollTextPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                scrollTextPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    
                toolBar.add(redoButton);
                toolBar.add(undoButton);
                toolBar.setFloatable(false);
                header.setLayout(new BorderLayout());
                header.add(toolBar, BorderLayout.CENTER);
                add(header, BorderLayout.NORTH);
                add(scrollTextPane1, BorderLayout.CENTER);
                initAction();
            }
    
            public void initAction() {
    
                textPane.getDocument().addUndoableEditListener(new UndoableEditListener() {
                    @Override
                    public void undoableEditHappened(UndoableEditEvent uee) {
    
                        um.addEdit((UndoableEdit) uee.getEdit());
                        listModel.addElement(textPane.getText().toString().charAt(textPane.getText().length() - 1));
    
                        MyRenderer renderer = new MyRenderer(textPane.getText().length() - 1, Color.yellow);
                        undoList.setCellRenderer(renderer);
    
                        textPane.addKeyListener(new KeyAdapter() {
                            @Override
                            public void keyTyped(KeyEvent ke) {
                                for (int k = indexS + 1; k < undoList.getModel().getSize(); k++) {
                                    listModel.removeElementAt(k);
                                }
                            }
                        });
    
                        indexF = listModel.getSize() - 1;
                        indexS = listModel.getSize() - 1;
                    }
                });
    
                undoButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        if (um.canUndo()) {
                            um.undo();
                        }
                    }
                });
                redoButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        if (um.canRedo()) {
                            um.redo();
                        }
                    }
                });
            }
        }
    
        //Jlist render
        class MyRenderer extends DefaultListCellRenderer {
    
            private Font font1;
            private Font font2;
            private Color rowcolor;
            private int row;
            private int[] rows;
            private DefaultListModel model;
    
            public MyRenderer() {
                this.font1 = getFont();
                this.font2 = font1.deriveFont((float) (font1.getSize() + 10));
            }
    
            public MyRenderer(int row, Color color) {
                this.rowcolor = color;
                this.row = row;
            }
    
            public MyRenderer(int[] rows, Color color) {
                this.rowcolor = color;
                this.rows = rows;
            }
    
            public MyRenderer(Color rowcolor, DefaultListModel model) {
                this.rowcolor = rowcolor;
                this.model = model;
            }
    
            public Component getListCellRendererComponent(JList list, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (rows == null) {
                    if (index == row) {
                        setBackground(this.rowcolor);
                        //setFont(getFont().deriveFont((float) (getFont().getSize() + 2)));
                    }
                } else {
                    for (int i = 0; i < rows.length; i++) {
                        if (index <= rows[i]) {
                            setBackground(this.rowcolor);
                        }
                    }
                }
                return this;
            }
        }
    
        public static void main(String[] args) {
            new UndoTextFrame().setVisible(true);
    
        }
    }
    


     

  • 相关阅读:
    LeetCode OJ String to Integer (atoi) 字符串转数字
    HDU 1005 Number Sequence(AC代码)
    HDU 1004 Let the Balloon Rise(AC代码)
    HDU 1003 Max Sum(AC代码)
    012 Integer to Roman 整数转换成罗马数字
    011 Container With Most Water 盛最多水的容器
    010 Regular Expression Matching 正则表达式匹配
    007 Reverse Integer 旋转整数
    006 ZigZag Conversion
    005 Longest Palindromic Substring 最长回文子串
  • 原文地址:https://www.cnblogs.com/james1207/p/3285621.html
Copyright © 2011-2022 走看看