2009-05-17 4 views
1

JCheckboxes, JTextfields, JLists 및 기타 JComponents가 많은 응용 프로그램 속성 페이지라고합니다. 이제 사용자가 변경 한 내용을 추적하여 저장해야합니다. 이것을 구현하는 올바른 방법은 무엇입니까?스윙 GUI의 변경 내용 추적

답변

2

변경 사항을 실시간으로 추적 할 필요가 없습니다 (특별한 필요가없는 경우).

구성 요소를 반복하면서 값을 가져 오거나 이전 값과 비교하거나 모든 값을 맹목적으로 저장하면 OK 단추를 사용하여 반응 할 수 있습니다.
물론 사용자가 취소하면 모든 것을 포기합니다. 당신이 사용할 수있는

+0

동의하며 간단하게 유지할 것입니다. – yanchenko

0

명령 클래스와 명령의 Serializable ArrayList 또는 LinkedList입니다. 명령은 actionPerformed 메소드에서 생성됩니다.

+0

JTextfield에 입력하는 것만으로 ActionEvent가 생성되지 않습니다. – yanchenko

+0

텍스트 필드에 입력하기위한 이벤트 처리기가 없습니까? 필요한 것은 TypingCommand, CheckboxCommand 등과 같은 추상 명령 클래스와 하위 클래스입니다. 적어도 내가 할 수있는 것은 –

1

두 가지 접근 방법 :

(1) 사용자가 JComponent의에서 현재 값을 끌어와 설정이나 이것 저것을 업데이트, 사용자의 속성 페이지에서 확인을 클릭합니다. 이것은 ActionListeners가 필요하지 않기 때문에 가장 쉬운 방법이며, 사용자가 백 아웃하면 변경 사항을 롤백 할 필요가 없습니다 (질문에서이 대화/페이지가하는 일이 무엇인지 명확하게 알 수는 없습니다).

(2) ActionListener를 구현하는 스윙 개체의 경우 ActionEvent를 수신 대기하고 이에 따라 변경 내용을 처리하십시오. JTextFields은 아래의 샘플 코드로의 DocumentListener를 사용

(2) 사용자가 밖으로 백업하는 경우에 대해 와서 당신이 방법에 대해 생각해야에서 당신은 (1), 도전에서 추측 할 수 있듯이
import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

public class Test implements DocumentListener 
{ 
    private JTextField jtf; 

    public static void main(String[] args) 
    { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
      Test test = new Test(); 
      } 
     }); 
    } 
    public Test() 
    { 
    JFrame jf = new JFrame(); 
    JPanel jp = new JPanel(); 
    jtf = new JTextField(); 
    jtf.getDocument().addDocumentListener(this); 
    jp.setLayout(new BorderLayout()); 
    jp.add(jtf, BorderLayout.CENTER); 
    jf.add(jp); 
    jf.setSize(200, 100); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.setVisible(true); 
    } 

    public void changedUpdate(DocumentEvent e) 
    { 
    // Do stuff here 
    } 
    public void insertUpdate(DocumentEvent e) 
    { 
    // Do stuff here 
    } 
    public void removeUpdate(DocumentEvent e) 
    { 
    // Do stuff here 
    } 
} 

변경 사항을 롤백 할 것입니다. 그것은 정말로 당신이하고있는 것에 달려 있습니다.

+0

대단한 답변, 감사합니다. – yanchenko

1

Observer Pattern이 도움이됩니다. 기본적으로 구성 요소 (게시자)가 다른 구성 요소 (구독자)에게 사실을 알릴 수 있도록 기본적으로 ActionListener (예 : Catchwa's Answer)입니다. 구글

에서

Java Example of Observer Pattern에게 당신은 내가 그 조금 도움이되기를 바랍니다 Head First Design Patterns의 2 장 또는 Action Listener Tutorial

을 확인할 수있는 경우, 그 뜻을 희망 순간에 예를 채찍질 할 수는 없지만 시작하는 데 도움이됩니다.

-1

내가 가지고있는 주된 질문은 어떤 변경/이벤트를 기록하고 싶은지입니다. 클릭, 텍스트 변경, 버튼 상태, ...

모든 이벤트에 대해 스윙 구성 요소에 리스너를 추가 할 수 있습니다. 하나의 singleton 클래스는 다른 구성 요소에 추가하려는 리스너의 구현 자일 수 있습니다. 이 싱글 톤 클래스를 다른 컴포넌트에 추가 할 수 있습니다.

구성 요소가 특수 수신기를 변경하거나 알리면 singleton 관리자에게 알리고이 이벤트를 처리 할 수 ​​있습니다.

관리자는 들어오는 이벤트를 기록 할 수 있으며 저장할 이벤트가 모두 포함 된 EventObject도 저장할 수 있습니다. xstream을 사용하여 디스크에 저장할 수있는 EventObject 목록입니다.

+0

이 경우 싱글 톤을 사용하지 않을 것입니다 ... 필요하지 않고 유연성을 제한합니다. – keuleJ

관련 문제