“SwingUtilities.updateComponentTreeUI(本)”去除的JCombo

2019-10-29 16:52发布

我有一个编辑的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(本); 并运行此PROGRAMM,我只能得到这样的输出:

新文本插入文本!

看来,JcomboBox的文档已被删除。 为什么自定义的文件删除,如何解决这个问题呢? 我想是自定义文档仍然会在JComboBox中执行SwingUtilities.updateComponentTreeUI(本)之后;

FYI:我用SwingUtilities.updateComponentTreeUI(本); 新的字体应用到集装箱。

Answer 1:

这是因为JcomboBox的编辑器是由它的UI,代表控制,即XXComboBoxUI:作为updateUI设置一个新的用户界面,控制编辑器更换为好。 一对夫妇的选择:

  • 登记在下拉框中一个PropertyChangeListener当编辑器被更换而得到通知,并重新设置自定义文档
  • 安装自定义编辑器(而不是只自定义文档)
  • (可能不是一个选项,以防万一)不使用updateUI,而不是走在容器设置字体


文章来源: 'SwingUtilities.updateComponentTreeUI(this)' removes custom Document from JComboBox