영어가 매우 좋지 않아서 Google에서 아무 것도 찾을 수 없었습니다. JTextField
이 많이 포함 된 JPanel
인 JFrame
이 있습니다. "파일 저장"기능을 만들 때 모든 JTextField
에 대해 KeyListener
을 입력해야했습니다. 그것을하는 더 효율적인 방법이 있습니까?JTextField를 많이 사용하는 하나의 키 수신기
편집 : 모든 필드가에 대해서는
영어가 매우 좋지 않아서 Google에서 아무 것도 찾을 수 없었습니다. JTextField
이 많이 포함 된 JPanel
인 JFrame
이 있습니다. "파일 저장"기능을 만들 때 모든 JTextField
에 대해 KeyListener
을 입력해야했습니다. 그것을하는 더 효율적인 방법이 있습니까?JTextField를 많이 사용하는 하나의 키 수신기
편집 : 모든 필드가에 대해서는
저장 마지막으로 이후 수정 된 경우,
편집을 테스트하는 것입니다 : 필드의 마지막 이후 수정 된 경우
을 저장 테스트하는 것입니다
그런 다음 DocumentListener를 사용하십시오. 이 방법을 사용하면 잘라 내기 및 붙여 넣기와 같은 키 누르기를 넘어서 발생하는 변경 사항을들을 수 있으며 여전히 동일하게 응답합니다.
당신은 질문 :
이 멋진 보이지만 인 JPanel에 추가의 방법이 아니면 내가 모든 필드에 추가 할 필요가?
각 필드의 문서에 수신기를 추가해야하지만 목록이나 배열에 필드를 넣으면 간단한 for 루프를 사용하면 쉽게 수행 할 수 있습니다. 예를 들어 다음 코드를 실행합니다. 저장 버튼을 누르거나 alt-s를 눌러 활성화 할 때마다 비활성화됩니다. JTextField에 보관 된 문서가 변경되면 자동으로 활성화됩니다.
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class DocListenerEg extends JPanel {
private static final int FIELD_COUNT = 10;
private static final int COLUMNS = 8;
private JButton saveButton = new JButton(new SaveAction("Save", KeyEvent.VK_S));
private List<JTextField> fieldList = new ArrayList<>();
public DocListenerEg() {
MyDocListener docListener = new MyDocListener();
add(saveButton);
for (int i = 0; i < FIELD_COUNT; i++) {
JTextField field = new JTextField(COLUMNS);
add(field);
fieldList.add(field);
field.getDocument().addDocumentListener(docListener);
}
}
public void documentChange() {
saveButton.setEnabled(true);
}
private class MyDocListener implements DocumentListener {
private boolean changed = false;
@Override
public void changedUpdate(DocumentEvent dEvt) {
documentChange();
}
@Override
public void insertUpdate(DocumentEvent dEvt) {
documentChange();
}
@Override
public void removeUpdate(DocumentEvent dEvt) {
documentChange();
}
}
private class SaveAction extends AbstractAction {
public SaveAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent evt) {
// TODO: save the data
((AbstractButton) evt.getSource()).setEnabled(false);
}
}
private static void createAndShowGui() {
DocListenerEg mainPanel = new DocListenerEg();
JFrame frame = new JFrame("DocListenerEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
멋지게 보이지만 JPanel에 추가 할 방법이 있습니까? 아니면 모든 필드에 추가해야합니까? – Germi
@Germi : 위의 편집을 참조하십시오. –
왜 파일을 저장하려면 JTextField에 KeyListener가 필요합니까? 이벤트를 시작하는 단추가있는 것만으로도 충분합니다. – Dici
JTextField와 같은 텍스트 구성 요소에 KeyListener를 거의 절대 추가해서는 안됩니다. Key Bindings와 같이이를 수행하는 더 좋은 방법이있을 수 있습니다. 사실 그것은 잠재적 인 해결책입니다. 어떤 주요 언론이 함정에 빠지려하니? –
' "EDIT : 마지막 저장 이후 수정 된 필드가 있는지 테스트하는 것입니다."-이 경우에는 DocumentListener를 사용하십시오. –