处理类之间的事件

时间:2012-08-19 15:47:21

标签: java swing class events communication

我有一个带有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);
    }
}

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

2 个答案:

答案 0 :(得分:6)

您可以创建界面ValueSubmittedListener

interface ValueSubmittedListener {
    public void onSubmitted(String value);
}

并让Editor实现它。

class Editor implements ValueSubmittedListener{

    ...

    public void onSubmitted(String value) {
        // add text to JTextPane.
    }
}

然后让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());
        }
    }

}

然后,每当您需要向编辑器发送新值时(即:在submitButton的{​​{1}}中),只需调用方法ActionListener

更新:

我忘了在notifyListeners的{​​{1}}中提及,您必须将initComponents注册到Main

Editor

答案 1 :(得分:2)

关键原则是根据需要传递引用,以便每个对象都可以访问所需的对象。

例如,如果“提交”表示将文本字段(工具栏中的文本)中的文本附加到编辑器的文本窗格,则可以执行以下操作:

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

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

private final JTextPane textpane=new JTextPane();
public class Editor extends JPanel{
    public Editor(){
        super();
        initComponents();
    }

    private void initComponents(){
        this.setLayout(new BorderLayout());
        this.add(textpane, BorderLayout.CENTER);
    }

    public void appendText(final String text) {
        this.textpane.setText( this.textpane.getText()+text );
    }
}

public class Toolbar extends JPanel{
    private final Editor editor;
    public Toolbar(final Editor editor){
        super();
        this.editor = editor;
        initComponents();
    }

    private void initComponents(){
        final JTextField textfield=new JTextField();
        JButton submitbutton=new JButton("Submit");
        submitbutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent event) {
                editor.appendText( textfield.getText() );
            }
            });

        this.setLayout(newFlowLayout());
        this.add(textfield);
        this.add(submitbutton);
    }
}