微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Swing:焦点问题

我正在为我的游戏制作关卡编辑器.我有一个属性面板,我可以在其中修改所选对象的属性.我还有一个Save按钮来编写级别xml.

当编辑器组件失去焦点或按下Enter时,将提交字段编辑(*).这很有效,但唯一的问题是,当我有这一系列的动作时:

>编辑一个字段
>按保存按钮

因为,会发生什么:

>我编辑该字段
>我按下保存按钮
>级别已保存
>该领域失去了焦点
>编辑已提交

如您所见,这是错误的顺序.当然我希望该字段失去焦点,这会导致提交然后保存级别.

是否有技巧,黑客或解决方法使字段首先失去焦点,然后执行保存按钮的动作侦听器?

提前致谢.

(* submit =字段的编辑也在对象属性中进行)

编辑:对于我正在使用FocusAdost的FocusAdapter的字段:

FocusAdapter focusAdapter = new FocusAdapter()
{

    @Override
    public void focusLost(FocusEvent e)
    {
        compProperties.setProperty(i,getColor());
        record(); // For undo-redo mechanism
    }
};

对于按钮,一个简单的ActionListener与actionPerformed`.

btnSave.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(java.awt.event.ActionEvent evt) {
         // Save the level
     }
});

解决方法

嗯…无法重现:在下面的片段中,丢失的内容总是在actionPerfomed之前得到通知,独立于我是否单击按钮或使用助记符:
final JTextField field = new JTextField("some text to change");
    FocusAdapter focus = new FocusAdapter() {

        @Override
        public void focusLost(FocusEvent e) {
            LOG.info("lost: " + field.getText());
        }

    };
    field.addFocusListener(focus);

    Action save = new AbstractAction("save") {

        @Override
        public void actionPerformed(ActionEvent e) {
            LOG.info("save: " + field.getText());
        }
    };
    save.putValue(Action.MNEMONIC_KEY,KeyEvent.VK_S);
    JButton button = new JButton(save);
    JComponent Box = Box.createHorizontalBox();
    Box.add(field);
    Box.add(button);

另一方面,焦点是依赖的棘手属性,排序可能是系统依赖的(我的是胜利视野).检查代码段在您的代码上的行为方式.

>如果您看到与我相同的序列,则问题出在其他地方
>如果在丢失之前得到保存,请尝试将保存操作包装到invokelater(将其置于EventQueue的末尾,以便在所有挂起事件之后执行)

Action save = new AbstractAction("save") {

    @Override
    public void actionPerformed(ActionEvent e) {
        SwingUtilities.invokelater(new Runnable() {
            public void run() {
                LOG.info("save: " + field.getText());
            }
        });
    }
};

原文地址:https://www.jb51.cc/java/129604.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐