2014-09-27 2 views
1

영어가 매우 좋지 않아서 Google에서 아무 것도 찾을 수 없었습니다. JTextField이 많이 포함 된 JPanelJFrame이 있습니다. "파일 저장"기능을 만들 때 모든 JTextField에 대해 KeyListener을 입력해야했습니다. 그것을하는 더 효율적인 방법이 있습니까?JTextField를 많이 사용하는 하나의 키 수신기

편집 : 모든 필드가에 대해서는

+0

왜 파일을 저장하려면 JTextField에 KeyListener가 필요합니까? 이벤트를 시작하는 단추가있는 것만으로도 충분합니다. – Dici

+0

JTextField와 같은 텍스트 구성 요소에 KeyListener를 거의 절대 추가해서는 안됩니다. Key Bindings와 같이이를 수행하는 더 좋은 방법이있을 수 있습니다. 사실 그것은 잠재적 인 해결책입니다. 어떤 주요 언론이 함정에 빠지려하니? –

+0

' "EDIT : 마지막 저장 이후 수정 된 필드가 있는지 테스트하는 것입니다."-이 경우에는 DocumentListener를 사용하십시오. –

답변

2

저장 마지막으로 이후 수정 된 경우,

편집을 테스트하는 것입니다 : 필드의 마지막 이후 수정 된 경우

을 저장 테스트하는 것입니다

그런 다음 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(); 
     } 
     }); 
    } 
} 
+0

멋지게 보이지만 JPanel에 추가 할 방법이 있습니까? 아니면 모든 필드에 추가해야합니까? – Germi

+0

@Germi : 위의 편집을 참조하십시오. –