2016-02-28 67 views

回答

5

子彈不幸硬編碼在TextFieldSkin,但你可以很容易地通過覆蓋默認情況下,像這樣營造PasswordSkin:

import com.sun.javafx.scene.control.skin.TextFieldSkin; 
import javafx.scene.control.PasswordField; 
import javafx.scene.control.TextField; 

public class PasswordSkin extends TextFieldSkin { 
    public PasswordSkin(TextField textField) { 
     super(textField); 
    } 

    protected String maskText(String txt) { 
     if (getSkinnable() instanceof PasswordField) { 
      int n = txt.length(); 
      StringBuilder passwordBuilder = new StringBuilder(n); 
      for (int i = 0; i < n; i++) 
       passwordBuilder.append("*"); 

      return passwordBuilder.toString(); 
     } else { 
      return txt; 
     } 
    } 
} 

要使用它,在你的PasswordField致電setSkin

PasswordField input = new PasswordField(); 
input.setSkin(new PasswordSkin(input)); 

或者,您也可以在樣式表中包含以下內容,而不是手動設置蒙皮:

.password-field { 
    -fx-skin: 'sample.PasswordSkin' 
} 

確保sample.PasswordSkin已更新以反映您皮膚的完全限定類名。現在,加載了樣式表的每個場景或節點都不需要手動配置皮膚。

+1

請注意,在Java 9中,「TextFieldSkin」的包名稱更改爲「javafx.scene.control.skin.TextFieldSkin」(並且它成爲公共API的一部分)。 –