选择密码排和粘贴在记事本中显示的密码

我一直在面对,我最近创建了我的Java应用程序的上述问题。 尽管我清楚地设置字段JPasswordField中,并试图掩盖与astericks密码,我继续面临这个问题。 我发出当我们编辑它,只有当你选择行出现密码字段不会发生。 例如,我有一排2列,如果我选择了整个行,​​试图复制粘贴到记事本排出现的pasword。 我在Java编程世界的新,如果有人可以帮助将是很大的帮助。

--------------解决方案-------------

你想要的是相当合乎逻辑的。 当复制粘贴从表中数据的呈现应该得到尊重。

该标准的复制操作将利用现有的数据模型,其中的密码可为纯文本。 您是否希望您的模型包含一个密码为纯文本,而不适用于任何散列我们可以展开讨论......但是,这并不回答你的问题。

对于你的问题,你应该修改的剪切/复制行为的行为JTable 。 看看的拖放Swing指南,并且更具体地添加剪切,复制和粘贴节。 不幸的是我没有立即找到一个例子来参考一下。

编辑

下面为一个示例JXTable其使用拷贝动作呈现的值(我没有复制粘贴的进口)。 一个小侧面说明有关的代码:

  1. 它使用SwingX说明东西克列奥帕特拉以及
  2. 这个例子TableModel及其要素是相当愚蠢的。 为了避免太多的工作,我需要类似我们的实际产品的东西能够复制一些代码
  3. SpeedStringValueAltitudeStringValue类违反StringValue接口,因为他们返回null 。 我才懒得定义一个新的接口, StringValue比如我在SwingX设置DefaultTableRenderer根据文档的行为。 我认为这不过有单独StringValue情况下,每个有知识,为特定的类转换为String是缺乏在真实世界中的用例SwingX
  4. TransferHandler重用StringValue逻辑来创建一个Table只包含String实例,然后倒在默认的JTable行为。 这允许重新使用在渲染器中实现的逻辑,并允许视觉值复制,而不是模型值。 我不知道这是否是最好的解决方案,但它的工作原理。 这将是很好但是如果类似的行为在标准SwingX ,因为他们已经有基础设施
  5. 该代码缺少注释,因为它已经足够长的时间。 如果有什么不清楚,发表评论,我会试图澄清

    public class TableTransferHandlerDemo {

    public static void main( String[] args ) throws InvocationTargetException, InterruptedException {
    EventQueue.invokeAndWait( new Runnable() {
    public void run() {
    JFrame frame = new JFrame( "TestFrame" );

    JPanel contentPane = new JPanel( new BorderLayout( ) );
    contentPane.add( createTable(), BorderLayout.CENTER );
    frame.getContentPane().add( contentPane );

    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible( true );
    }
    } );
    }

    private static CompositeStringValue createStringValue() {
    CompositeStringValue stringValue = new CompositeStringValue();
    stringValue.delegates.add( new AltitudeStringValue() );
    stringValue.delegates.add( new SpeedStringValue() );
    return stringValue;
    }

    public static JXTable createTable(){
    final JXTable table = new JXTable( );
    table.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
    table.setModel( createTableModel() );
    CompositeStringValue stringValue = createStringValue();
    table.setDefaultRenderer( Object.class, new DefaultTableRenderer( stringValue ) );
    table.setTransferHandler( new TableTransferHandler( table, stringValue ) );
    //make sure ctrl-c triggers a copy
    InputMap inputMap = table.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
    inputMap.put( KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_MASK ), "copyAction" );
    table.getActionMap().put( "copyAction", new AbstractAction() {
    public void actionPerformed( ActionEvent e ) {
    ActionEvent event = new ActionEvent( table, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers() );
    TransferHandler.getCopyAction().actionPerformed( event );
    }
    } );
    return table;
    }

    public static class Speed{
    public double speed;
    public String unit = "km/h";
    public Speed( double speed ){ this.speed = speed;}
    }
    public static class Altitude{
    public double altitude;
    public String unit = "m";
    public Altitude( double altitude ){ this.altitude = altitude; }
    }
    public static class SpeedStringValue implements StringValue{
    public String getString( Object o ) {
    if ( o instanceof Speed ){
    return ( ( Speed ) o ).speed + ( ( Speed ) o ).unit;
    }
    return null;
    }
    }
    public static class AltitudeStringValue implements StringValue{
    public String getString( Object o ) {
    if ( o instanceof Altitude ){
    return ( ( Altitude ) o ).altitude + ( ( Altitude ) o ).unit;
    }
    return null;
    }
    }
    public static class CompositeStringValue implements StringValue{
    public List<StringValue> delegates = new ArrayList<StringValue>( );
    public String getString( Object o ) {
    for ( StringValue stringValue : delegates ) {
    String string = stringValue.getString( o );
    if ( string != null ) return string;
    }
    return o != null ? o.toString() : "null";
    }
    }
    public static TableModel createTableModel(){
    return new DefaultTableModel(
    new Object[][]{ new Object[]{ new Speed( 10 ), new Altitude( 100 )},
    new Object[]{ new Speed( 20 ), new Altitude( 200 ) }},
    new Object[]{"Speed", "Altitude"} );
    }
    public static class TableTransferHandler extends TransferHandler{
    private JXTable table;
    private StringValue stringValue;

    public TableTransferHandler( JXTable aTable, StringValue aStringValue ) {
    table = aTable;
    stringValue = aStringValue;
    }
    @Override
    public void exportToClipboard( JComponent aComponent, Clipboard aClipboard, int aAction ) throws IllegalStateException {
    JTable table = createTable();
    table.getTransferHandler().exportToClipboard( table, aClipboard, aAction );
    }
    @Override
    public void exportAsDrag( JComponent aComponent, InputEvent aEvent, int aAction ) {
    JTable table = createTable();
    table.getTransferHandler().exportAsDrag( table, aEvent, aAction );
    }
    @Override
    protected Transferable createTransferable( JComponent c ) {
    //this transfer handler should not create any transferables
    return null;
    }
    /**
    * Create a table, representing the JXTable containing only Strings
    */
    private JTable createTable() {
    JTable table = new JTable( new StringTableModel( this.table, stringValue ) );
    table.setSelectionModel( this.table.getSelectionModel() );//make sure the selection is synced
    return table;
    }
    }

    private static class StringTableModel extends AbstractTableModel {
    private JXTable delegateTable;
    private StringValue stringValue;

    private StringTableModel( JXTable aTable, StringValue aStringValue ) {
    delegateTable = aTable;
    stringValue = aStringValue;
    }

    public int getRowCount() {
    return delegateTable.getModel().getRowCount();
    }

    public int getColumnCount() {
    return delegateTable.getModel().getColumnCount();
    }

    public Object getValueAt( int aRowIndex, int aColumnIndex ) {
    return stringValue.getString( delegateTable.getValueAt( aRowIndex, aColumnIndex ) );
    }
    }
    }

玩猜谜游戏的其他人(的描述缺乏... ;-)

因此,假设包含用户名和密码两列的TableModel,分别呈现在一个JTable与真和默认的TransferHandler启用拖放。 假设JTable中的密码渲染是“蒙面”,但不知何故出现在C&P为明文。

@Robin已检测的根本原因:默认的TransferHandler只需使用getValueAt(...)的toString()来创建转让。 这导致透出密码字符串,它这就是被存储在模型。

一个简单的出路(而不是一个更好的TransferHandler,这再次@Robin已经提到:使用渲染值,而不是需要的toString注意自己:对SwingX文件任务)为是不存储明文口令,但一个包装对象:

public class Password {
private final String password;

public Password(String password) {
this.password = password;
}

// api as needed to make it worthwile ...

public boolean isValid(String password) {
...
}

// for the sake of c&p, override the toString
// for the lazy, this is the string rep used by the default renderer
@Override
public String toString() {
return "******************";
}
}

附录(这是SwingX具体,延长我在@罗宾的例子评论)

其实我喜欢的方法,因为复制一个快速的解决方案。 只是“修复”的包装模式,充分利用现有的API,那就是使用table.getStringAt(...)的字符串表示。 同的是,没有必要传递的StringValue在几个地方,内部将处理在适当的情况。

private static class StringTableModel extends AbstractTableModel {
private JXTable delegateTable;

private StringTableModel(JXTable aTable) {
delegateTable = aTable;
}

@Override
public int getRowCount() {
return delegateTable.getRowCount();
}

@Override
public int getColumnCount() {
return delegateTable.getColumnCount();
}

@Override
public Object getValueAt(int aRowIndex, int aColumnIndex) {
return delegateTable.getStringAt(aRowIndex, aColumnIndex);
}
}

在框架层面,SwingX应该支持WYSIWYE(什么,你看到的,是什么,你的出口)出关框,就像它的其他WYSIWYX:X = M的比赛,X =为排序S,X = F过滤器。 在SwingX问题跟踪提出问题1477

你有没有试过在密码栏禁用单元编辑?

您可以通过扩展JTable类和自己的实现替代的isCellEditable功能做到这一点。

使用这里示出的例子中,我能够粘贴,但不能复制或剪切,密码。 发生这种情况的的可见无论echoChar设置。 你看到一个不同的结果?

分类:java的 时间:2015-03-15 人气:11
本文关键词: 爪哇,秋千
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.234 (s). 10 q(s)