-1

デリケートな問題があります!

入力ベリファイアをテキスト フィールドに設定するフォームがあり、ユーザーが間違った値を入力すると、他のテキスト フィールドとラジオ ボタンを無効にする必要があります。

2 番目のテキスト フィールド (姓) で、ユーザーが間違った値を入力すると、他のコンポーネントは完全に無効になりますが、ユーザーがその値を編集して修正する場合 (たとえば、数字を削除するなど)、ユーザーはキーボードtabボタンを使用して他のコンポーネント (ラジオ) を有効にする必要がありますボタン)とラジオボタンをクリックして有効にしたい。

これが私のコードです:

public class UserDialog3 extends JDialog implements ActionListener {
JButton cancelBtn, okBtn;
JTextField fNameTf, lNameTf;
JRadioButton maleRb, femaleRb;
ButtonGroup group;
JLabel fNameLbl, lNameLbl, genderLbl, tempBtn, temp3, temp2, temp1;

public UserDialog3() {
    add(createForm(), BorderLayout.CENTER);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    setLocation(400, 100);
    pack();
    setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new UserDialog3();
        }
    });
}

public JPanel createForm() {
    JPanel panel = new JPanel();

    okBtn = new JButton("Ok");
    cancelBtn = new JButton("Cancel");
    tempBtn = new JLabel();
    fNameLbl = new JLabel("First Name");
    lNameLbl = new JLabel("Last Name");
    genderLbl = new JLabel("Gender");
    temp2 = new JLabel();
    temp1 = new JLabel();

    maleRb = new JRadioButton("Male");
    femaleRb = new JRadioButton("Female");
    temp3 = new JLabel();
    group = new ButtonGroup();
    group.add(maleRb);
    group.add(femaleRb);

    fNameTf = new JTextField(10);
    fNameTf.setName("FnTF");
    fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
    lNameTf = new JTextField(10);
    lNameTf.setName("LnTF");
    lNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));

    panel.add(fNameLbl);
    panel.add(fNameTf);
    panel.add(temp1);
    panel.add(lNameLbl);
    panel.add(lNameTf);
    panel.add(temp2);
    panel.add(genderLbl);
    JPanel radioPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
    radioPanel.add(maleRb);
    radioPanel.add(femaleRb);
    panel.add(radioPanel);
    panel.add(temp3);
    panel.add(okBtn);
    panel.add(cancelBtn);
    panel.add(tempBtn);

    panel.setLayout(new SpringLayout());
    SpringUtilities.makeCompactGrid(panel, 4, 3, 50, 10, 80, 60);
    return panel;
}

@Override
public void actionPerformed(ActionEvent e) {

}

public class MyVerifier extends InputVerifier {
    private JComponent[] component;

    public MyVerifier(JComponent[] components) {
        component = components;
    }

    @Override
    public boolean verify(JComponent input) {
        String name = input.getName();

        if (name.equals("FnTF")) {
            String text = ((JTextField) input).getText().trim();
            if (text.matches(".*\\d.*") || text.length() == 0) {
                //disable dependent components
                for (JComponent r : component) {
                    r.setEnabled(false);
                }
                return false;
            }
        } else if (name.equals("LnTF")) {
            String text = ((JTextField) input).getText();
            if (text.matches(".*\\d.*") || text.length() == 0) {
                //disable dependent components
                for (JComponent r : component) {
                    r.setEnabled(false);
                }
                return false;
            }
        }
        //enable dependent components
        for (JComponent r : component) {
            r.setEnabled(true);
        }
        return true;
    }
}
}
4

1 に答える 1

0

クラスの目的は、InputVerifierクライアントがテキスト フィールドのある GUI を介してスムーズなフォーカス ナビゲーションをサポートできるようにすることです。フォーカスを要求する別の Swing コンポーネントにフォーカスが転送される前に、入力ベリファイアのshouldYieldFocusメソッドが呼び出されます (verify関数にデータの検証を要求します)。フォーカスは、そのメソッドが を返す場合にのみ転送されますtrue

以前の投稿で述べたようにInutVerifier、の使用に関する問題を修正してみてください。習慣を変えなければ、将来的に危険です。検証機能からコードを有効化および無効化するコンポーネントを削除します。verifyshouldYieldFunction

この投稿の問題:この場合、実際に起こっていることは、データが無効で、別のコンポーネントをクリックして入力テキスト フィールドのフォーカスを失わせようとすると、無効になることですJRadioButtons 。無効になっているものは、再度有効にするまでフォーカスできません。input-verifier は focus-lose イベントで応答するため、 をクリックしてdisabled RadioButtonもフォーカス ナビゲーションShouldYieldFocus(which calls verify)が行われないため、コンポーネントを再度有効にするために呼び出されません。

タブを押すと、swing のフォーカス トラバーサル ポリシーに従ってフォーカスが 2 番目のテキスト入力フィールドに送信されるため、機能します。したがって、最初の入力テキスト フィールドでフォーカス喪失イベントが発生し、今回InputVerifierの verify 関数が呼び出され、最終的にコンポーネントが有効になります。問題をよりよく理解するために、自分の例を one JRadioButtonand oneで書き直してみてくださいJTextFeild


DocumentListenerテキストフィールドでa を使用してみてください。データの挿入および削除イベント時に、使用してデータの有効性を確認し、InputVerifier関連するコンポーネントを有効/無効にします。

およびテキストフィールドに追加DocumentListenerすると問題が解決する方法を示すサンプルコードスニペットを作成しています。fNameTFlNameTF

fNameTF.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent e) {
              doOnDataValidity(verifier.verify(fNameTF));
           }

            @Override
            public void removeUpdate(DocumentEvent e) {
               doOnDataValidity(verifier.verify(fNameTF));
            }

            @Override
            public void changedUpdate(DocumentEvent e) {}
        });

doOnValidity(boolean isValid)機能は次のとおりです。

public void doOnDataValidity(boolean isDataValid)
    {
         if(isDataValid) 
         {
            //enable your components 
         }else 
          {
              //disable your components
          }
    }

lNameTf.getDocument()同じ方法で DocumentListener を追加します。

チュートリアル リソース: DocumentListener の使用方法

于 2013-10-24T12:56:57.713 に答える