4

次のJTextFieldクラスがあります。RoundedJTextFieldを作成します。JPasswordFieldはJTextFieldから継承すると思ったので、今度はJPasswordFieldに同じ設定を使用したいと思いました。次のことができます:JPasswordField new_field = new RoundField(SOME Parameters);しかし、それは大きな災害でした。コードを繰り返さずにJPasswordFieldを丸める方法はありますか?

    public class RoundField extends JTextField {
    public RoundField(String text, int x, int y, int width, int height) {
        setText(text);
        setBounds(x, y, width, height);
        setForeground(Color.GRAY);
        setHorizontalAlignment(JTextField.CENTER);
        setOpaque(false);
        setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));
    }

    protected void paintComponent(Graphics g) {
        g.setColor(getBackground());
        g.fillRoundRect(0, 0, getWidth(), getHeight(), 8, 8);
        super.paintComponent(g);
    }
}

PS:必要に応じて、setTextをコンストラクターから移動してもかまいません。

4

2 に答える 2

3

InPursuitは正しいです。継承を使用して問題を解決することはできません。

しかし、代わりにファクトリーデザインパターンを使用するのはどうでしょうか。のコンストラクターで現在行っているすべてのUI変更を処理する外部クラスを作成しますRoundField

元:

class BorderUtil {

    @SuppressWarnings({ "unchecked", "serial" })
    public static <T extends JTextField> T createTextField(T field, String text, int x, int y, int width,
            int height) {

        T f = null;
        if (field instanceof JPasswordField) {
            f = (T) new JPasswordField(text) {
                @Override
                protected void paintComponent(Graphics g) {
                    g.setColor(getBackground());
                    g.fillRoundRect(0, 0, getWidth(), getHeight(), 8, 8);
                    super.paintComponent(g);
                }
            };
        } else {
            f = (T) new JTextField(text) {
                @Override
                protected void paintComponent(Graphics g) {
                    g.setColor(getBackground());
                    g.fillRoundRect(0, 0, getWidth(), getHeight(), 8, 8);
                    super.paintComponent(g);
                }
            };
        }

        f.setBounds(x, y, width, height);
        f.setForeground(Color.GRAY);
        f.setHorizontalAlignment(JTextField.CENTER);
        f.setOpaque(false);
        f.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));
        return f;
    }
}

このようにして、ほとんどの重複を回避し、明確さを得ることができます。

メソッドを呼び出すのは本当に簡単です。

JPasswordField pf = BorderUtil.createTextField(yourPasswordField, "Text", 0, 0, 10, 10);
于 2012-08-18T19:11:42.413 に答える
1

jpasswordfieldが継承しているクラスを変更することはできないので、コードを繰り返さずにこれを行う方法はありません。

于 2012-08-18T18:48:57.863 に答える