English 中文(简体)
Focus Listener 回调方法对于从同一个变量中分离的即时对象不起作用吗?
原标题:FocusListener callback method doesn t work for separately instantiated objects from same variable?

目前我正在研究我们组第一学期考试项目的GUI部分, 我遇到了一个有趣的问题,

一个有点离题的话题:我仔细地搜寻了这个非常困难的话题, 但实在找不到任何在爪哇使用回调的具体例子, 所以从我所收集的信息来看... 从定义上说... 我在这里做什么其实是一个回调( 如果你能解释原因, 或者指给我一个能彻底解释原因的页面的话, 这会很棒 )

这里的代码是:

private FocusListener callback = new FocusListener(){
    @Override public void focusGained(FocusEvent e){
        if(hasBeenSet){}else{tfield.setText("");hasBeenSet=true;}
    } @Override public void focusLost(FocusEvent e){}};

    ...

    tfield = new JTextField("Insert CPR number", 8);
    constraint.gridx = 0;
    constraint.gridy = 1;
    constraint.gridwidth = 2;
    panel.add(tfield, constraint);

            tfield.addFocusListener(callback);

    tfield = new JTextField("Type new password", 8);
    constraint.gridx = 0;
    constraint.gridy = 2;
    panel.add(tfield, constraint);

            tfield.addFocusListener(callback);

    tfield = new JTextField("Retype new password", 8);
    constraint.gridx = 0;
    constraint.gridy = 3;
    panel.add(tfield, constraint);

            tfield.addFocusListener(callback);

当我启动 GUI 时, 它有三(3) 个文本字段, 想法是当用户聚焦于文本字段时删除文本。 这应该适用于所有三个文本字段, 但显然, 无论您点击哪个文本字段, 只有最后一个文本字段会被设置为空字符串 。 我对此非常好奇, 因为每个对象都是个别即时的 。

很明显,这里的工作就是把tfield改名为“tfield[1-3]”,但如果你能用这个来逗我:

请注意, GUI 代码实际上都在构建器中。 是的, 我知道这完全是荒谬的, 但我们的设计显示, 所有逻辑和数据处理都会在构建器完成后发生... 所以这里不应该有威胁, 但我不知道这是否会与 Focus Reasoner 的回调方法发生冲突 。

谢谢。 :)

P. S. 对于“ 重新输入新密码” 字段, 我承认 JComponent JPassword Field, 这个问题解决后, 将会更改。 所以不需要安全警告 :)

最佳回答

tfield 变量持有 last 实例 JTextField 的引用。 做你想做的事的方式是:

private FocusListener callback = new FocusListener() {
    @Override public void focusGained(FocusEvent e){
        JTextField jtf = (JTextField) e.getSource();
        if(hasBeenSet){}else{jtf.setText("");hasBeenSet=true;}
    }
    ...

注意: 正如您当前读取的代码, has beenSet 将共享所有三个文本字段。

<强> 更新:

Java没有关闭支持, 所以当 < code> pointGained 运行时, 它会看到 < code> tfield 的最后值, 而不是安装 listerner 时的 < code> tfield 值 。

看起来 has beenSet 被定义为外类成员,因此 pointGained 正在检查所有3个文本字段的 same 变量。 这是处理我认为您正在尝试做的事情的方法 :

tfield = new JTextField("Insert CPR number", 8);
tfield.putClientProperty("originalText", tfield.getText());

然后在焦点中,Gained:

    @Override public void focusGained(FocusEvent e){
        JTextField jtf = (JTextField) e.getSource();
        if(jtf.getClientProperty("originalText").equals(jtf.getText())){
             jtf.setText("");
        }
    }

putClientProperty/getClientProperty 方法在 JComponent 类中定义,因此这些方法可用于继承 Jcomponent 的每一个滚动图形界面组件。它们存储/检索一个 Object 给定的字符串。在此情况下,“原始文本”字符串持有最初用于初始化 JTextField 的值。在获得焦点时,如果字段仍然包含该值,它会被设置为空白。同样,如果字段为空白,您可以在“code>gentLost

问题回答

暂无回答




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签