代码之家  ›  专栏  ›  技术社区  ›  Makore

如果文本不存在或为空,为什么BasicComboBoxRenderer使用getPreferredSize()设置文本两次?

  •  0
  • Makore  · 技术社区  · 1 年前

    在使用此类进行相关工作时,我发现了以下代码:

    public Dimension getPreferredSize() {
        Dimension size;
        if (this.getText() == null || this.getText().isEmpty()) {
             setText( " " );
             size = super.getPreferredSize();
             setText( "" );
        } 
         else {
             size = super.getPreferredSize();
        }
        return size;
    }
    
    

    我知道这个类是一个JLabel,可以使用标签进行渲染。 但是为什么在这个getter过程中被初始化(如果不是的话)呢? 仅仅在构造函数上做这件事不会更有意义吗?

    1 回复  |  直到 1 年前
        1
  •  2
  •   Some random IT boy    1 年前

    通过阅读 source code

    您可以看到一条解释此类行为的评论:

      /**
      77:    * Returns preferredSize of the renderer
      78:    * 
      79:    * @return preferredSize of the renderer
      80:    */
      81:   public Dimension getPreferredSize()
      82:   {
      83:     if (this.getText() != null && ! this.getText().equals(""))
      84:       return super.getPreferredSize();
      85:     else
      86:       {
      87:         // If the combo box option's text is empty or null, it won't size
      88:         // properly (ie, it'll be way too short)... so we throw in a dummy
      89:         // space to trick the superclass's sizing methods.
      90:         String oldText = this.getText();
      91:         this.setText(" ");
      92:         Dimension d = super.getPreferredSize();
      93:         this.setText(oldText);
      94:         return d;
      95:       }
      96:   }