두 개의 텍스트 필드가 있으며 사용자가 해당 텍스트 필드에 입력하는 값을 제어합니다. 두 텍스트 필드 모두 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);
}
}
Java GUI는 다른 로케일의 다른 PLAF를 사용하여 다른 OS ', 화면 크기, 화면 해상도 등에서 작동해야합니다. 따라서, 픽셀 완벽한 레이아웃에 도움이되지 않습니다. 대신 레이아웃 관리자 또는 [조합] (http://stackoverflow.com/a/5630271/418556)과 [공백] 레이아웃 채우기 및 테두리 (http://stackoverflow.com/a/17874718/)를 사용하십시오. 418556). –