提问者:小点点

当窗口焦点丢失时,如何保存JComboBox编辑?


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

这工作得很好,除了最后一个编辑的组合框。对于最后一个组合框,当窗口失去焦点时,内容仍在编辑中。JComboBox#getSelectedItem()方法返回null,因为在窗口失去焦点之前编辑尚未完成。至少我假设正在发生这种情况。

在处理框架之前,当窗口失去焦点时,如何完成编辑并选择编辑的文本?

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

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);
            }
        });
    }
}

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


共1个答案

匿名用户

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

有关对编辑器组件的访问,请参阅JComboBoxgetEditor()方法。