【问题标题】:How to use UndoRedoSupport or undoSupport of glazedlist in JTable?如何在 JTable 中使用 glazedlist 的 UndoRedoSupport 或 undoSupport?
【发布时间】:2012-06-14 13:13:47
【问题描述】:

我用 GlazedList eventList 创建了一个 JTable。 我搜索了 API,但不知道如何向该表添加撤消/重做可能性。我在 API 中发现了以下类:

UndoRedoSupport undoRedoSupport = new UndoRedoSupport<"what here?">("argument?"); UndoSupport undoSupport = new UndoSupport<"what to write here?">("argument?");

有人知道如何使用它吗?

private void createComponents() {
    EventList<Dien> eventList = new BasicEventList<Dien>();
    actionList  = GenericsUtil.makeList();
    table  = new WebTable();
    searchField = new WebTextField(60);
    String[] headers = new String[]{"Code", "Name", "Number"};
    String[] properties = new String[]{"Code", "Name", "Number"};
    TextFilterator<Dien> dienFilterator = new TextFilterator<Dien>() {
        public void getFilterStrings(List baseList, Dien dien) {
            baseList.add(dien.getCode());
            baseList.add(dien.getName());
            baseList.add(dien.getNumber());
        }
    };
    MatcherEditor<Dien> textMatcherEditor = new TextComponentMatcherEditor<Dien>(searchField, dienFilterator);
    eventList = toolModel.getDiens();
    FilterList<Dien> filterList = new FilterList<Dien>(eventList, textMatcherEditor);
    TableFormat tableFormat = GlazedLists.tableFormat(properties, headers, new boolean[]{true,true,true});
    model = new EventTableModel<Dien>(filterList, tableFormat);
    model.addTableModelListener(new TableModelListener() {
        public void tableChanged(TableModelEvent e) {
            if(e.getType()==TableModelEvent.UPDATE){
                if(!panel.isPendingChanges())
                    panel.setPendingChange(true);
            }
        }
    });
    selectionModel = new EventSelectionModel<Dien>(filterList);

    table.setSelectionModel(selectionModel);
    table.setModel(model);

}

【问题讨论】:

    标签: java swing undo-redo glazedlists


    【解决方案1】:

    GlazedLists 内置的 Undo/Redo 类不带有公共构造函数;相反,您可以通过UndoRedoSupport.install() 静态方法安装对特定事件列表的支持。

    当然,如果您使用的是 Swing,那么利用 Swing 的 UndoManager 类是有意义的,而 GlazedLists 提供了一个简单的包装器及其 UndoSupport 类。同样,这只是使用其install() 方法进行初始化。

    我创建了一个简单的 Swing 示例应用程序作为示例来说明如何使用这些类。在我的示例中,我使用了一个简单的 EventList 字符串和一个 JList。但它同样适用于任何 GlazedList 支持的组件——UndoRedoSupport 适用于 EventList 本身,而不是 Swing 组件。

    import ca.odell.glazedlists.BasicEventList;
    import ca.odell.glazedlists.EventList;
    import ca.odell.glazedlists.swing.EventListModel;
    import ca.odell.glazedlists.swing.UndoSupport;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    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.JTextField;
    import javax.swing.undo.UndoManager;
    
    
    public class GlazedListsUndoSample {
    
        private JFrame mainFrame;
        private JButton addItemButton;
        private JButton undoButton;
        private JButton redoButton;
        private UndoManager undoManager;
    
        private EventList<String> eventList = new BasicEventList<String>();
    
        public GlazedListsUndoSample() {
            //populateAvailableBooks();
            createGui();
            mainFrame.setVisible(true);
    
        }
    
        private void updateButtons() {        
            //addBookButton.setEnabled(!books.isEmpty());
            undoButton.setEnabled(undoManager.canUndo());
            redoButton.setEnabled(undoManager.canRedo());
        }
    
        private void createGui() {
            undoManager = new UndoManager();
            UndoSupport.install(undoManager, eventList);
    
            mainFrame = new JFrame("GlazedLists Undo Example");
            mainFrame.setSize(600, 400);
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            EventListModel model = new EventListModel(eventList);
            JList list = new JList(model);
    
            JPanel mainPanel = new JPanel(new BorderLayout());
            mainPanel.add(new JScrollPane(list), BorderLayout.CENTER);
    
            JPanel addBookPanel = new JPanel(new BorderLayout());
            addBookPanel.add(new JLabel("Item"), BorderLayout.WEST);
            final JTextField titleTextField = new JTextField(50);
            addBookPanel.add(titleTextField, BorderLayout.CENTER);
    
            addItemButton = new JButton("Add Item");
            addItemButton.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    eventList.add(titleTextField.getText());
    
                    updateButtons();
                }
            });
            addBookPanel.add(addItemButton, BorderLayout.EAST);
    
    
            JPanel buttonPanel = new JPanel();
    
            undoButton = new JButton("Undo");
            undoButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (undoManager.canUndo()) {
                        undoManager.undo();
                    }
    
                    updateButtons();
                }
            });
    
            redoButton = new JButton("Redo");
            redoButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (undoManager.canRedo()) {
                        undoManager.redo();
                    }
    
                    updateButtons();
                }
            });
    
            updateButtons();
    
            buttonPanel.add(undoButton);
            buttonPanel.add(redoButton);
    
            mainPanel.add(addBookPanel, BorderLayout.NORTH);
            mainPanel.add(buttonPanel, BorderLayout.SOUTH);
    
            mainFrame.getContentPane().setLayout(new BorderLayout());
            mainFrame.getContentPane().add(mainPanel, BorderLayout.CENTER);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                  new GlazedListsUndoSample();
                }
            });
        }
    }
    

    值得注意的是,documentation 确实强烈暗示了它的功能限制:

    并非 ListEvent 中描述的每个更改都会导致可撤消的编辑。 具体来说,列表元素 IN PLACE 的突变不会产生 可撤消的编辑。例如,观察到的 ObservableElementList 元素的更改,或对 List.set(int, E) 的调用具有相同的 该索引处的对象产生一个没有 对应的 UndoRedoSupport.Edit 对象。这些 ListEvents 是 被忽略,因为它们缺乏足够的信息来撤消或重做 改变。

    一般来说,UndoRedoSupport 仅适用于 BasicEventList 或 BasicEventList 周围的简单包装器 不影响元素的顺序或类型,例如 可观察元素列表。高级转换,例如 SortedList 或 使用此 UndoRedoSupport 类时,FilterList 将无法按预期工作 因为它们的内容是由外部信息控制的 自己(比较器和匹配器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2012-07-02
      • 2011-07-01
      相关资源
      最近更新 更多