2013-12-22 3 views
2

구성 요소에 Integer 값이 있습니다.이 값은 포커스가 없을 때 초당 3 번 업데이트됩니다.Swing Timer에 의해 초당 3 회 업데이트되는 JFormattedTextField의 사용자 편집 값을 얻는 방법?

값을 업데이트하려면 스윙 타이머를 사용합니다.

사용자가 값 (모델의 일부 값을 업데이트하기 위해)을 편집 할 수있게하고 싶지만 JFormattedTextField 값이 포커스를 잃을 때마다 업데이트되지 않는다는 것을 알고 있습니다. 그래서 lostFocus 이벤트의 모델 속성을 변경하는 것이 현명하지 않으며 초점을 잃을 때 값을 업데이터 모듈에서 변경할 수있어 상황을 더욱 어렵게 만듭니다.

propertyListener을 사용할 수없는 것은 분명합니다. 값이 1 초에 3 번 업데이트되기 때문입니다.

이제 JFormattedTextField 기능을 사용하는 곳에서 변수를 업데이트하고 포커스가 없을 때 updater가 내 JFormattedTextField를 업데이트 할 수 있을지 궁금합니다! 가능한가요 아니면 대신 inputDialog을 사용해야합니까? 방법?

예를 들어 다음 코드에서 GUI에서 필드 값을 200으로 변경 한 다음 JFrame을 클릭하여 포커스를 잃게하려면 콘솔에 인쇄 된 값이 200이 아닙니다. 이전에 현장에서.

public class SwingTimerFormattedTextFieldTester { 

    public static void main(String... args){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBounds(0, 0, 300, 200); 
     final JFormattedTextField field = new JFormattedTextField(new Long(100)); 
     field.setColumns(20); 
     frame.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       frame.requestFocus(); 
       e.consume(); 
      } 


     }); 

     frame.getContentPane().setLayout(new FlowLayout()); 
     frame.getContentPane().add(field); 
     frame.setVisible(true); 

     Timer timer = new Timer(330, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(!field.hasFocus()){ 
        field.setValue(ThreadLocalRandom.current().nextLong()); 
       } 
      } 
     }); 
     timer.start(); 

     field.addFocusListener(new FocusListener() { 

      @Override 
      public void focusGained(FocusEvent e) { 
       field.setBackground(Color.CYAN); 
      } 

      @Override 
      public void focusLost(FocusEvent e) { 
       field.setBackground(Color.WHITE); 
       System.out.println(String.valueOf((Long)field.getValue())); 
      } 
     }); 

     frame.requestFocus(); 
    } 

} 
+3

곧 답변을 얻지 못하면 [sscce] (http://sscce.org)를 표시하는 것이 가장 좋습니다. –

+0

@HovercraftFullOfEels 좋은 의견입니다. 어쩌면 내가 처음부터 추가 했어야했는데. – puk

답변

3

포커스가 손실되었을 때 JFormattedTextField에 대한 편집을 커밋하면 어떻게 되나요?

@Override 
public void focusLost(FocusEvent e) { 
    try { 
     if (field.isEditValid()) { 
      field.commitEdit(); 
     } 
    } catch (ParseException e1) { 
     e1.printStackTrace(); 
    } 
    field.setBackground(Color.WHITE); 
    System.out.println(String.valueOf((Long) field.getValue())); 
} 
+0

뛰어난 사람! @HovercraftFullOfEels 어떻게 스윙 전문 개발자가 되었습니까? 나는 그것이 질문으로 stackoverflow에서 요청하는 것이 허용되지 않는 것 같아요. Swing/JavaFX를 전문적으로 체계적으로 습득 할 수있는 책이나 자료가 있습니까? – puk

+2

@puk : 저는 전문적인 스윙 개발자는 아니지만 취미가 있습니다. 필자는 스윙, 튜토리얼, API, 특히 스윙 소스 코드를 통해 프로젝트를 만들고, 여기를 통해 많은 것을 배웠다. 위의 솔루션은 FormattedTextField API에서 왔습니다. 거기에 가면 초점을 잃었을 때 특별한 고려 사항이 있다는 것을 알 수 있습니다. –