window 焦点丢失时如何保存 JComboBox 编辑?

How can I save JComboBox edits when window focus is lost?

我有一个 Java Swing 应用程序,其中一些数据显示在可编辑的组合框中。组合框显示在单独的框架中。单击按钮时会临时打开框架。该框架没有 window 修饰,当它失去焦点时(即用户在 window 之外单击)是 closed/disposed。当框架关闭时,组合框内容被保存。

除最后编辑的组合框外,效果很好。对于最后一个组合框,当 window 失去焦点时内容仍在编辑中。 JComboBox returns 的#getSelectedItem() 方法为null 因为在window 失去焦点之前编辑还没有完成。至少我认为这就是正在发生的事情。

window在处理框架之前失去焦点,如何完成编辑并select编辑的文本?

这是一个最小的可重现示例:

import java.awt.Container;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
class Example extends JFrame {

    public static void main(String[] args) {
        new Example();
    }
    
    public Example() {
        Container c = getContentPane();
        JPanel panel = new JPanel();

        JComboBox<String> box1 = new JComboBox<String>();
        box1.setEditable(true);
        panel.add(box1);

        JComboBox<String> box2 = new JComboBox<String>();
        box2.setEditable(true);
        panel.add(box2);

        c.add(panel);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
        
        this.addWindowFocusListener(new WindowAdapter() {
            public void windowLostFocus(WindowEvent e) {
                System.out.println("Field 1: " + box1.getSelectedItem() + ". Field 2: " + box2.getSelectedItem() + ".");
                System.exit(0);
            }
        });
    }
}

示例 class 将显示一个包含两个可编辑组合框的框架。如果在框架外单击,应用程序将在打印两个组合框的内容后退出。您会注意到,如果只访问过一次,最后编辑的组合框会打印 null

向用作编辑器的组合框文本字段添加 FocusListener。当文本字段失去焦点时应生成一个事件。

查看 JComboBoxgetEditor() 方法访问编辑器组件。