密码样式TextCellEditor在TableViewer中显示原始字符



TextCellEditorpassEdit具有SWT.PASSWORD样式。但当点击Add按钮时,会显示原始字符,而不是默认的*回声字符。同时将听众的注意力集中在passEdit不起作用上。即,当用户双击时,它应该显示原始字符,在焦点丢失时,它应显示密码回声字符。

如何解决此问题?

    public class UserAddSolution {
    public static boolean flag = true;
    private TextCellEditor userNameEdit;
    private TextCellEditor passEdit;
    class UserNamePassword {
        private final String name;
        private final String password;
        public UserNamePassword(String name, String password) {
            this.name = name;
            this.password = password;
        }
        public String getName() {
            return name;
        }
        public String getPassword() {
            return password;
        }
    }
    public UserAddSolution(final Shell shell) {
        shell.setLayout(new GridLayout(2, false));
        GridData layoutData = new GridData();
        layoutData.heightHint = 300;
        shell.setLayoutData(layoutData);
        final TableViewer viewer = new TableViewer(shell, SWT.BORDER
                | SWT.FULL_SELECTION | SWT.MULTI);
        viewer.setContentProvider(ArrayContentProvider.getInstance());
        Table table = viewer.getTable();
        table.setLayout(new GridLayout());
        table.setLayoutData(layoutData);
        userNameEdit = new TextCellEditor(table);
        passEdit = new TextCellEditor(table, SWT.PASSWORD);
        final Text tex = (Text) passEdit.getControl();
        final char echar = tex.getEchoChar();
        tex.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e) {
                tex.setEchoChar(echar);
            }
            @Override
            public void focusGained(FocusEvent e) {
                tex.setEchoChar('');
            }
        });
        viewer.setCellEditors(new CellEditor[] { userNameEdit, passEdit });
        viewer.setCellModifier(new ICellModifier() {
            @Override
            public boolean canModify(Object element, String property) {
                return true;
            }
            @Override
            public Object getValue(Object element, String property) {
                UserNamePassword ele = (UserNamePassword) element;
                if (property.equals("1")) {
                    return ele.getName();
                } else if (property.equals("2")) {
                    return ele.getPassword();
                }
                return "";
            }
            @Override
            public void modify(Object element, String property, Object value) {
            }
        });
        viewer.setColumnProperties(new String[] { "1", "2" });
        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
                viewer) {
            @Override
            protected boolean isEditorActivationEvent(
                    ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };
        int feature = ColumnViewerEditor.TABBING_HORIZONTAL
                | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                | ColumnViewerEditor.TABBING_VERTICAL
                | ColumnViewerEditor.KEYBOARD_ACTIVATION;
        TableViewerEditor.create(viewer, actSupport, feature);
        TableViewerColumn userNameColumn;
        userNameColumn = new TableViewerColumn(viewer, SWT.NONE);
        userNameColumn.getColumn().setWidth(200);
        userNameColumn.getColumn().setMoveable(true);
        userNameColumn.getColumn().setText("Name");
        userNameColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(Object element) {
                return super.getImage(element);
            }
            @Override
            public String getText(Object element) {
                UserNamePassword fdf = (UserNamePassword) element;
                return super.getText(fdf.getName());
            }
        });
        TableViewerColumn passwordColumn;
        passwordColumn = new TableViewerColumn(viewer, SWT.NONE);
        passwordColumn.getColumn().setWidth(200);
        passwordColumn.getColumn().setMoveable(true);
        passwordColumn.getColumn().setText("Password");
        passwordColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(Object element) {
                return super.getImage(element);
            }
            @Override
            public String getText(Object element) {
                UserNamePassword fdf = (UserNamePassword) element;
                return super.getText(fdf.getPassword());
            }
            @Override
            public void update(ViewerCell cell) {
                super.update(cell);
            }
        });
        viewer.setInput(new ArrayList<UserNamePassword>());
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        viewer.refresh();
        Button add = new Button(shell, SWT.PUSH);
        add.setText("Add");
        add.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                viewer.add(new UserNamePassword("abc", "xyz"));
            }
            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        });
    }
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        new UserAddSolution(shell);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

ColumnLabelProvider负责显示表中的数据。文本小部件仅在编辑单元格时显示。这就是为什么您需要告诉标签提供程序屏蔽字符而不显示纯文本。

因此,您不需要将SWT.PASSWORD样式设置为passEdit,因为您希望在编辑器中以纯文本形式显示密码:

passEdit = new TextCellEditor(table, SWT.NONE);

您也不需要FocusListener,您可以将echo-char设置为常量:

private static final String ECHARSTR = Character.toString((char)9679);

因此,您可以删除passEdit 初始化以下的15行

我不知道JFace中是否有解决方案(我认为没有(,但您可以通过修改现有的标签提供者来轻松解决这个问题。我的建议是将ColumnLabelProvidergetText()方法修改为passwordColumn,如下所示:

@Override
public String getText(Object element)
{
    UserNamePassword fdf = (UserNamePassword)element;
    return fdf.getPassword().replaceAll(".", ECHARSTR);
}

最新更新