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
。当文本字段失去焦点时应生成一个事件。
查看 JComboBox
的 getEditor()
方法访问编辑器组件。
我有一个 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
。当文本字段失去焦点时应生成一个事件。
查看 JComboBox
的 getEditor()
方法访问编辑器组件。