我有一个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
。
向用作编辑器的组合框文本字段添加Focus usListener
。当文本字段失去焦点时,应生成事件。
有关对编辑器组件的访问,请参阅JComboBox
的getEditor()
方法。