我想用圖像和提示創建一些更好看的JTextFields。爲此,我製作了一個覆蓋paintComponent方法的裝飾器。我使用裝飾器的原因是我想將它應用於其他類型的JTextField,如JPasswordField。用圖像和提示裝飾JTextField
這是我到目前爲止;
如被看見在左邊的表格的問題是,即使我已經使用了一個JPasswordField中的的paintComponent似乎忽略了我認爲是密碼的paintComponent這大概確實的密碼屏蔽符號。
所以問題是,我如何避免重複JTextFields和JPasswordFields的代碼,但仍然具有不同的功能,如密碼掩碼。
這是裝飾者代碼;
public class JTextFieldHint extends JTextField implements FocusListener{
private JTextField jtf;
private Icon icon;
private String hint;
private Insets dummyInsets;
public JTextFieldHint(JTextField jtf, String icon, String hint){
this.jtf = jtf;
setIcon(createImageIcon("icons/"+icon+".png",icon));
this.hint = hint;
Border border = UIManager.getBorder("TextField.border");
JTextField dummy = new JTextField();
this.dummyInsets = border.getBorderInsets(dummy);
addFocusListener(this);
}
public void setIcon(Icon newIcon){
this.icon = newIcon;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int textX = 2;
if(this.icon!=null){
int iconWidth = icon.getIconWidth();
int iconHeight = icon.getIconHeight();
int x = dummyInsets.left + 5;
textX = x+iconWidth+2;
int y = (this.getHeight() - iconHeight)/2;
icon.paintIcon(this, g, x, y);
}
setMargin(new Insets(2, textX, 2, 2));
if (this.getText().equals("")) {
int width = this.getWidth();
int height = this.getHeight();
Font prev = g.getFont();
Font italic = prev.deriveFont(Font.ITALIC);
Color prevColor = g.getColor();
g.setFont(italic);
g.setColor(UIManager.getColor("textInactiveText"));
int h = g.getFontMetrics().getHeight();
int textBottom = (height - h)/2 + h - 4;
int x = this.getInsets().left;
Graphics2D g2d = (Graphics2D) g;
RenderingHints hints = g2d.getRenderingHints();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.drawString(hint, x, textBottom);
g2d.setRenderingHints(hints);
g.setFont(prev);
g.setColor(prevColor);
}
}
protected ImageIcon createImageIcon(String path, String description) {
java.net.URL imgURL = getClass().getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
@Override
public void focusGained(FocusEvent arg0) {
this.repaint();
}
@Override
public void focusLost(FocusEvent arg0) {
this.repaint();
}
}
而這是我創造的領域;
JTextField usernameField = new JTextFieldHint(new JTextField(),"user_green","Username");
JTextField passwordField = new JTextFieldHint(new JPasswordField(),"bullet_key","Password");
希望我沒有完全在這裏錯誤的方向去!
謝謝!
編輯:再次看到它,很明顯,調用super.paintComponent(g)將要調用JTextFields paintcomponent,但我無法看到如何解決這個問題,而無需重複代碼。
你是說Border Border = BorderFactory ....只是+1 – mKorbel 2011-05-22 21:44:19
你可以創建一個CompoundBorder。使用原始邊框作爲外部邊框,然後使用帶有圖標的MatteBorder作爲內部邊框 – camickr 2011-05-22 22:07:32
清晰直接,謝謝 – mKorbel 2011-05-22 23:03:52