구성 요소에 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();
}
}
곧 답변을 얻지 못하면 [sscce] (http://sscce.org)를 표시하는 것이 가장 좋습니다. –
@HovercraftFullOfEels 좋은 의견입니다. 어쩌면 내가 처음부터 추가 했어야했는데. – puk