Java Swing: focus issues
I'm making a level editor for my game I have a property panel where I can modify the properties of the selected object I also have a save button to write level XML
When the editor component loses focus or presses enter, the field edit (*) is committed This works, but the only problem is, when I have this series of actions:
>Edit a field > press Save button
Because, what happens:
>I edit the field > I press the Save button > level saved > the field has lost focus > Edit submitted
As you can see, this is the wrong order Of course, I want this field to lose focus, which will result in a commit and then save level
Is there a trick, hacker or solution to make the field lose focus first, and then execute the action listener of the Save button?
Thank you in advance
(* SUBMIT = field is also edited in the object attribute)
Edit: for the field of focusadapter where I am using focusadost:
FocusAdapter focusAdapter = new FocusAdapter()
{
@Override
public void focusLost(FocusEvent e)
{
compProperties.setProperty(i,getColor());
record(); // For undo-redo mechanism
}
};
For buttons, a simple actionlistener and actionperformed '
btnSave.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
// Save the level
}
});
Solution
Mmm... Not reproducible: in the following clip, missing content is always notified before actionperfomed, independent of whether I click a button or use a mnemonic:
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 @R_125_2419@ = @R_125_2419@.createHorizontal@R_125_2419@();
@R_125_2419@.add(field);
@R_125_2419@.add(button);
On the other hand, the focus is on the tricky properties of dependency, and sorting may be system dependent (my vision is victory) Check how code snippets behave on your code
>If you see the same sequence as me, the problem lies elsewhere > if you save before you lose it, try wrapping the save operation in invoker (put it at the end of eventqueue to execute after all pending events)
Action save = new AbstractAction("save") {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokelater(new Runnable() {
public void run() {
LOG.info("save: " + field.getText());
}
});
}
};
