我有一个带有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);
}
}
我应该如何在工具栏和编辑器之间实现事件处理?
答案 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);
}
}