1

私は2つのJTextFieldsを持っています:

JTextField txtJobType, txtPriorityCode;

これは私が必要とする機能です:

ユーザーがtxtJobTypeに「administration」と入力してタブを押す(またはクリックする)と、エラーチェックが実行され、フィールドが空かどうか、または入力されたテキストがデータベースに存在するかどうかが確認されます。私がそれをした方法は次のとおりです。

private void txtJobTypeFocusLost(java.awt.event.FocusEvent evt) {                                     
    System.out.println("JobType Focus Lost");
    if (!checkFieldExists(txtJobType.getText(), "jobType", "jobCode",
            JobType.class) || txtJobType.getText().isEmpty()) {
        txtJobType.requestFocusInWindow();
        txtJobType.selectAll();
    } else {
    }
} 

したがって、フィールドが存在しないか、テキストが空の場合は、フォーカスをtxtJobTypeに戻し、すべてのテキスト(存在する場合)を強調表示します。

それは問題なく動作します。ただし、まったく同じ動作をする必要があるtxtPriorityCodeフィールドがあります。だから私はしました:

private void txtPriorityCodeFocusLost(java.awt.event.FocusEvent evt) {                                          
    System.out.println("PriorityCode Focus Lost");
    if (!checkFieldExists(txtPriorityCode.getText(), "priority", "priorityCode",
            Priority.class) || txtPriorityCode.getText().isEmpty()) {
        txtPriorityCode.requestFocusInWindow();
        txtPriorityCode.selectAll();
    }
}

ここから問題が始まります。ユーザーがjobTypeとタブをPriorityのままにすると、コードはフォーカスをjobtypeに戻そうとしますが、その時点ではpriorityも空白であるため、jobtypeからフォーカスを取り戻そうとし、この出力になります。 :

PriorityCode Focus Lost
JobType Focus Lost
PriorityCode Focus Lost
JobType Focus Lost

少なくとも他の10個のテキストフィールドに対してこれを実行する必要があるため、この動作を実装する方法についてのヘルプはありがたいです。

ありがとう!

4

3 に答える 3

5

フォーカスが失われたり、その他の低レベルの構成要素をいじったりしないでください。代わりに、この例これも単純にInputVerifierを使用してみませんか?

たとえば、次のようになります。

import javax.swing.*;

public class InputVerifierEg {
   private JPanel mainPanel = new JPanel();
   private JTextField txtJobType = new JTextField(10);
   private JTextField txtPriorityCode = new JTextField(10);

   public InputVerifierEg() {
      txtJobType.setInputVerifier(new MyInputVerifier("jobType", "jobCode",
            JobType.class));
      txtPriorityCode.setInputVerifier(new MyInputVerifier("priority", "priorityCode",
            Priority.class));

      mainPanel.add(new JLabel("Job Type:"));
      mainPanel.add(txtJobType);
      mainPanel.add(Box.createHorizontalStrut(15));
      mainPanel.add(new JLabel("Priority Code:"));
      mainPanel.add(txtPriorityCode);

   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("InputVerifierEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new InputVerifierEg().getMainPanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

class MyInputVerifier extends InputVerifier {
   private String fieldName;
   private String codeName;
   private Class<?> classType;

   public MyInputVerifier(String fieldName, String codeName, Class<?> classType) {
      this.fieldName = fieldName;
      this.codeName = codeName;
      this.classType = classType;
   }

   @Override
   public boolean verify(JComponent input) {
      JTextField tField = (JTextField) input;

      // assuming that the checkFieldExists is a static method of a utility class
      if (!FieldCheckerUtil.checkFieldExists(tField.getText(), fieldName,
            codeName, classType)) {
         return false;
      }

      if (tField.getText().trim().isEmpty()) {
         return false;
      }
      return true;
   }

   @Override
   public boolean shouldYieldFocus(JComponent input) {
      JTextField tField = (JTextField) input;

      if (verify(input)) {
         return true;
      } else {
         tField.selectAll();
         // show JOptionPane error message?
         return false;
      }
   }
}
于 2012-08-21T16:07:19.093 に答える
0

たぶん、次の1つのチェックを行います。

txtPriorityCode.getText().isEmpty()

次に、次のことをテストします。

!txtPriorityCode.getText().isEmpty() && txtJobType.getText().isEmpty()

つまり、最初のチェックが空でない場合にのみ、2番目のチェックを実行します。

于 2012-08-21T15:36:46.133 に答える
0

個人的には、このように検証が行われると嫌いになり、適切と思われる形式でフィールドを移動できなくなります。フォームが送信されたときにすべてのフィールドで検証を行い、その時点で無効なフィールドを強調表示してみませんか?

于 2012-08-21T15:46:46.620 に答える