2017-12-27 21 views
0

두 개의 텍스트 필드가 있으며 사용자가 해당 텍스트 필드에 입력하는 값을 제어합니다. 두 텍스트 필드 모두 focusLost를 사용합니다. 그러나, 예를 들어, 사용자가 아무런 값 (컨트롤 중 하나)을 입력하지 않고 다른 텍스트 필드를 클릭하면 첫 번째 및 두 번째 텍스트 필드의 컨트롤 정보 메시지가 표시됩니다. 첫 번째 텍스트 필드에서 포커스가 손실 된 후 두 번째 텍스트 필드의 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는 다른 로케일의 다른 PLAF를 사용하여 다른 OS ', 화면 크기, 화면 해상도 등에서 작동해야합니다. 따라서, 픽셀 완벽한 레이아웃에 도움이되지 않습니다. 대신 레이아웃 관리자 또는 [조합] (http://stackoverflow.com/a/5630271/418556)과 [공백] 레이아웃 채우기 및 테두리 (http://stackoverflow.com/a/17874718/)를 사용하십시오. 418556). –

답변

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

나는 주석과 답변을 작성했습니다. 그 의견은 당신이 묻는 문제를 해결하는 것과 아무런 상관이 없습니다. 그것이 바로 답이 아니라 주석입니다. 흐름 레이아웃을 사용하면 댓글에서 확인 된 문제를 해결할 수 있지만 질문하는 주요 문제는 해결하지 못합니다. 귀하의 질문에 대한 답변은 다양한 방법으로 접근 할 수 있습니다. 한 가지 방법은 오류를 표시하기 위해 주 GUI에 (초점을 맞출 수없는)'JLabel '을 추가하는 것입니다. 포커스를 훔치지 않으므로 두 개의 오류 메시지가 사용자에게 표시되지 않습니다. –

+0

내 대답을 편집하십시오. 여기에는 레이블을 사용하여 오류를 표시하는 예제가 포함됩니다. –

관련 문제