Как правильно использовать UndoRedo.Manager()?

Я застрял на шаге отмены (включите действия "Отменить / повторить" для редактора) в этом руководстве: NetBeans CRUD.

Кнопки Undo/Redo не включены, даже если я следую инструкциям. Я думаю, что проблема связана с "UndoRedo.Manager" и "UndoRedo"

Вот часть моего кода:

public final class CustomerEditorTopComponent extends TopComponent implements LookupListener{
    private UndoRedo.Manager manager = new UndoRedo.Manager();
    private Lookup.Result result = null;


    public CustomerEditorTopComponent() {
        initComponents();
        setName(Bundle.CTL_CustomerEditorTopComponent());
        setToolTipText(Bundle.HINT_CustomerEditorTopComponent());

        nameField.addKeyListener(new KeyListener() {

            public void keyTyped(KeyEvent e) {
                nameField.getDocument().addUndoableEditListener(manager);
                cityField.getDocument().addUndoableEditListener(manager);
            }

            public void keyPressed(KeyEvent e) {
                nameField.getDocument().addUndoableEditListener(manager);
                cityField.getDocument().addUndoableEditListener(manager);
            }

            public void keyReleased(KeyEvent e) {
                nameField.getDocument().addUndoableEditListener(manager);
                cityField.getDocument().addUndoableEditListener(manager);
            }

        });

        cityField.addKeyListener(new KeyListener() {

            public void keyTyped(KeyEvent e) {
                nameField.getDocument().addUndoableEditListener(manager);
                cityField.getDocument().addUndoableEditListener(manager);
            }

            public void keyPressed(KeyEvent e) {
                nameField.getDocument().addUndoableEditListener(manager);
                cityField.getDocument().addUndoableEditListener(manager);
            }

            public void keyReleased(KeyEvent e) {
                nameField.getDocument().addUndoableEditListener(manager);
                cityField.getDocument().addUndoableEditListener(manager);
            }

        });
    }

        @Override
    public UndoRedo getUndoRedo() {
        return manager;
    }

Вот мой импорт:

import demo.Customer;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.undo.UndoManager;
import java.util.Collection;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.UndoRedo;
import org.openide.awt.UndoRedo.Manager;

import org.openide.util.Lookup;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
import org.openide.windows.TopComponent;
import org.openide.util.NbBundle.Messages;

import org.openide.windows.WindowManager;

Остальная часть кода в основном генерируется netbeans:

    private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    nameField = new javax.swing.JTextField();
    cityField = new javax.swing.JTextField();

    jPanel1.setBackground(null);
    jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

    jLabel1.setForeground(new java.awt.Color(0, 0, 0));
    org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(CustomerEditorTopComponent.class, "CustomerEditorTopComponent.jLabel1.text")); // NOI18N

    jLabel2.setForeground(new java.awt.Color(0, 0, 0));
    org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(CustomerEditorTopComponent.class, "CustomerEditorTopComponent.jLabel2.text")); // NOI18N

    nameField.setEditable(false);
    nameField.setBackground(new java.awt.Color(250, 250, 250));
    nameField.setForeground(new java.awt.Color(0, 0, 0));
    nameField.setText(org.openide.util.NbBundle.getMessage(CustomerEditorTopComponent.class, "CustomerEditorTopComponent.nameField.text")); // NOI18N

    cityField.setEditable(false);
    cityField.setBackground(new java.awt.Color(250, 250, 250));
    cityField.setForeground(new java.awt.Color(0, 0, 0));
    cityField.setText(org.openide.util.NbBundle.getMessage(CustomerEditorTopComponent.class, "CustomerEditorTopComponent.cityField.text")); // NOI18N

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jLabel1)
                .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(cityField, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
                .addComponent(nameField))
            .addGap(18, 18, 18))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel1)
                .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(8, 8, 8)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel2)
                .addComponent(cityField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(18, Short.MAX_VALUE))
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(113, Short.MAX_VALUE))
    );
}// </editor-fold>                        

// Variables declaration - do not modify                     
private javax.swing.JTextField cityField;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField nameField;
// End of variables declaration                   
@Override
public void componentOpened() {
    result = WindowManager.getDefault().findTopComponent("CustomerViewerTopComponent").getLookup().lookupResult(Customer.class);
    result.addLookupListener(this);
    resultChanged(new LookupEvent(result));
}

@Override
public void componentClosed() {
    result.removeLookupListener(this);
    result = null;
}

void writeProperties(java.util.Properties p) {
    // better to version settings since initial version as advocated at
    // http://wiki.apidesign.org/wiki/PropertyFiles
    p.setProperty("version", "1.0");
    // TODO store your settings
}

void readProperties(java.util.Properties p) {
    String version = p.getProperty("version");
    // TODO read your settings according to their version
}

@Override
public void resultChanged(LookupEvent lookupEvent) {
    Lookup.Result r = (Lookup.Result) lookupEvent.getSource();
    Collection<Customer> coll = r.allInstances();
    if (!coll.isEmpty()) {
        for (Customer cust : coll) {
            nameField.setText(cust.getName());
            cityField.setText(cust.getCity());
        }
    } else {
        nameField.setText("[no name]");
        cityField.setText("[no city]");
    }
}
}

0 ответов

Другие вопросы по тегам