0

我有一个可编辑的 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); 将新字体应用到容器。

4

1 回答 1

2

发生这种情况是因为 JComboBox 的编辑器由其 UI-Delegate 控制,即 XXComboBoxUI:当 updateUI 设置新的 ui 时,受控编辑器也被替换。几个选项:

  • 在comboBox上注册一个propertyChangeListener,以便在替换编辑器时得到通知并再次设置自定义文档
  • 安装自定义编辑器(而不仅仅是自定义文档)
  • (可能不是一个选项,以防万一)不要使用 updateUI,而是通过容器来设置字体
于 2013-06-28T07:21:33.590 回答