我有一个可编辑的 JComboBox 和 JTextField。两者都带有自定义文档。这是代码:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class SwingUtilStrangeBehav extends JFrame {
public SwingUtilStrangeBehav() {
JComboBox<String> combo = new JComboBox<>(new String[]{"a", "b", "c"});
combo.setEditable(true);
((JTextField)combo.getEditor().getEditorComponent()).setDocument(new PlainDocument() {
private static final long serialVersionUID = 1L;
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
System.out.println("New text inserted into combo!");
super.insertString(offs, str, a);
}
});
JTextField field = new JTextField();
field.setDocument(new PlainDocument() {
private static final long serialVersionUID = 1L;
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
System.out.println("New text inserted into text!");
super.insertString(offs, str, a);
}
});
Container c = getContentPane();
c.setLayout(new BoxLayout(c, BoxLayout.PAGE_AXIS));
c.add(combo);
c.add(Box.createRigidArea(new Dimension(0, 5)));
c.add(field);
//SwingUtilities.updateComponentTreeUI(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String arg[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new SwingUtilStrangeBehav();
}
});
}
}
然后我在 JComboBox 或 JTextField 中输入一些文本,我在控制台中得到以下输出,例如:
新文本插入组合!
新文本插入文本!
那太棒了!当我取消注释以下行SwingUtilities.updateComponentTreeUI(this); 并运行这个程序,我只能得到这个输出:
新文本插入到文本中!
似乎 JComboBox 的 Document 被删除了。为什么自定义文档被删除以及如何解决这个问题?我希望在执行SwingUtilities.updateComponentTreeUI(this);之后自定义 Document 仍然在 JComboBox 中;.
仅供参考:我使用SwingUtilities.updateComponentTreeUI(this); 将新字体应用到容器。