2017-12-27 41 views
0

私は2つのテキストフィールドを持ち、ユーザーがそのテキストフィールドに入力する値を制御します。どちらのテキストフィールドについても、私はfocusLostを使用します。しかし、たとえば、ユーザーが値を入力せず(コントロールの1つ)、他のテキストフィールドをクリックすると、第1および第2のテキストフィールドコントロールの情報メッセージが表示されます。私はフォーカスが最初のテキストフィールドから失われた後、2番目のテキストフィールドのfocusLostがトリガーされることを意味します。なぜこれが起こるのですか?これを防ぐ方法は?オプションペインが開かれなぜfocusLostの後に他のfocusLostがトリガーされるのですか?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.swing.border.*; 

public class Test extends JFrame 
{ 
    private JPanel pa; 
    private JTextField myTF1, myTF2; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try{ 
        Test frame = new Test(); 
        frame.setVisible(true); 
       } 
       catch(Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 



    public Test() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100,100,450,300); 
     pa = new JPanel(); 
     pa.setBorder(new EmptyBorder(5,5,5,5)); 
     setContentPane(pa); 
     pa.setLayout(null); 

     myTF1 = new JTextField(); 
     myTF1.addFocusListener(new FocusListener() 
     { 
      public void focusLost(FocusEvent arg) 
      { 
      if(myTF1.getText.equals("")) 
       JOptionPane.showMessageDialog(null, "Error1", "Error", JOptionPane.ERROR_MESSAGE); 
      } 

      public void focusGained(FocusEvent arg) 
      { 
      // This is empty.. I don't need it.. 
      } 
     }); 
     myTF1.setBounds(24,13,116,22); 
     pa.add(myTF1); 
     myTF1.setColumns(10); 

     myTF2 = new JTextField(); 
     myTF2.addFocusListener(new FocusListener() 
     { 
      public void focusLost(FocusEvent arg) 
      { 
       if(myTF2.getText.equals("")) 
       JOptionPane.showMessageDialog(null, "Error2", "Error", JOptionPane.ERROR_MESSAGE); 
      } 

      public void focusGained(FocusEvent arg) 
      { 
      // This is empty.. I don't need it.. 
      } 
     }); 
     myTF2.setBounds(24,48,116,22); 
     pa.add(myTF2); 
     myTF2.setColumns(10); 
    } 
} 
+0

のJava GUIは異なるロケールに異なるPLAFsを使用してなど異なるOS」、画面サイズ、画面の解像度で作業する必要があります。ここでは一例です。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –

答えて

1

オプション区画利益その瞬間にそれを持っているテキストフィールドのいずれかからそれを盗むフォーカス、。

これを解決する方法の1つは、エラーメッセージをメインGUI内のラベルに表示することです。

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.swing.border.*; 

public class Test2 extends JFrame { 

    private JTextField myTF1, myTF2; 
    private JLabel output = new JLabel("Enter a value in both field 1 & field 2"); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Test2 frame = new Test2(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public Test2() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationByPlatform(true); 
     JPanel gui = new JPanel(new BorderLayout(5,5));   
     gui.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(gui); 

     JPanel pa = new JPanel(new GridLayout(0, 1, 5, 5)); 
     gui.add(pa, BorderLayout.LINE_START); 
     gui.add(output, BorderLayout.PAGE_END); 

     myTF1 = new JTextField(10); 
     myTF1.addFocusListener(new FocusListener() { 
      public void focusLost(FocusEvent arg) { 
       if (myTF1.getText().equals("")) { 
        output.setText("Error: Field 1 must have a value!"); 
       } 
      } 

      public void focusGained(FocusEvent arg) { 
       // This is empty.. I don't need it.. 
      } 
     }); 
     myTF1.setBounds(24, 13, 116, 22); 
     pa.add(myTF1); 

     myTF2 = new JTextField(10); 
     myTF2.addFocusListener(new FocusListener() { 
      public void focusLost(FocusEvent arg) { 
       if (myTF2.getText().equals("")) { 
        output.setText("Error: Field 2 must have a value!"); 
       } 
      } 

      public void focusGained(FocusEvent arg) { 
       // This is empty.. I don't need it.. 
      } 
     }); 
     myTF2.setBounds(24, 48, 116, 22); 
     pa.add(myTF2); 

     pack(); 
    } 
} 
+0

その解決策は何ですか? EclipseのデザインモードからFlowLayoutを追加しましたが、問題は続いています – sanallhesap4

+0

私はコメントと答えを出しました。コメントはあなたが尋ねている問題を解決することとは関係がありません。それが答えではなくコメントである理由です。フローレイアウトを使用すると、コメントで特定された問題をうまく解決できるかもしれませんが、尋ねられている主な問題は解決していません。あなたの質問に対する答えには、さまざまな方法でアプローチすることができます。 1つの方法は、(非フォーカス可能な) 'JLabel'をメインGUIに追加してエラーを表示することです。フォーカスを奪うことはないので、ユーザーに2つのエラーメッセージが表示されることはありません。 –

+0

私の答えに編集を参照してください。これには、エラーを表示するためにラベルを使用する例が含まれています。 –

関連する問題