处理类之间的事件

Thi*_*zar 4 java events swing communication class

我有一个带有Editor类(带有JTextPane)和Toolbar类的主类(带有JList和Jbutton,我不想使用JToolBar).这两个类由许多组件组成,我不想将它们混合到同一个类中.我希望编辑器和工具栏进行通信.假设我在工具栏中写了"Hello",然后点击Submit.我希望文本窗格显示"Hello".我用这种方式构建类:

public class Main{
    public MainGUI(){
        initComponents();
    }

    private void initComponents(){
        JFrame mainframe=new JFrame("Main Frame");
        Editor editor=new Editor();
        Toolbar toolbar=new Toolbar();
        mainframe.getContentPane().setLayout(new BorderLayout());
        mainframe.getContentPane().add(editor, BorderLayout.CENTER);
        mainframe.getContentPane().add(toolbar, BorderLayout.NORTH);
        mainframe.setVisible(true);
    }
}

public class Editor extends JPanel{
    public Editor(){
        super();
        initComponents();
    }

    private void initComponents(){
        JTextPane textpane=new JTextPane();

        this.setLayout(new BorderLayout());
        this.add(textpane, BorderLayout.CENTER);
    }
}

public class Toolbar extends JPanel{
    public Toolbar(){
        super();
        initComponents();
    }

    private void initComponents(){
        JTextField textfield=new JTextField();
        JButton submitbutton=new JButton("Submit");

        this.setLayout(newFlowLayout());
        this.add(textfield);
        this.add(submitbutton);
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何在工具栏和编辑器之间实现事件处理?

Gen*_*zer 6

您可以创建一个界面 ValueSubmittedListener

interface ValueSubmittedListener {
    public void onSubmitted(String value);
}
Run Code Online (Sandbox Code Playgroud)

Editor实现它.

class Editor implements ValueSubmittedListener{

    ...

    public void onSubmitted(String value) {
        // add text to JTextPane.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后Toolbar提供方法

class Toolbar {

    private List<ValueSubmittedListener> listeners = new ArrayList<ValueSubmittedListener>();


    public void addListener(ValueSubmittedListener listener) {
        listeners.add(listener);
    }

    private void notifyListeners() {
        for (ValueSubmittedListener listener : listeners) {
            listener.onSubmitted(textfield.getText());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

然后每当你需要向Editor发送新值时(即:in submitButtons ActionListener),只需调用该方法即可notifyListeners.

更新:

我忘了提及的是,在initComponentsMain,你必须注册EditorToolbar:

private void initComponents() {
   JFrame mainframe = new JFrame("Main Frame");
   Editor editor = new Editor();
   Toolbar toolbar = new Toolbar();
   toolbar.addListener(editor); // register listener
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我的回答是使用Swing的事件处理.你也可以重用`ActionListener`. (2认同)
  • 别客气!这只是[Observer Pattern](http://en.wikipedia.org/wiki/Observer_pattern)的简单实现.您可以了解更多设计模式[这里](http://www.javaworld.com/columns/jw-java-design-patterns-index.html) (2认同)