gpt4 book ai didi

java - 复杂应用程序中的事件处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:05 24 4
gpt4 key购买 nike

我目前正在尝试用 Java 开发一个简单的记事本。但是,我正在努力正确处理事件监听器。我在编程时坚持单一职责原则。不幸的是,当前处理事件监听器的方式肯定违反了原则。

每次我创建一个新的菜单按钮时,我都必须实现 ActionListener 并覆盖 actionPerformed() 方法并将其作为 addActionListener() 方法的参数传递。结果,整个代码变得越来越复杂,并且打破了单一职责原则,因为事件监听器没有与 UI 分离。

当有很多组件需要处理时,问题会变得更加严重。以这种方式处理 70 或 100 个组件会使整个代码变得一团糟。

这是我正在谈论的代码:

menuButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(menuButton, "Message");
}
});

我也曾尝试使用内部类来处理事件监听器,但是在涉及 CPU 性能时,为每个组件定义这么多内部类并不是一个好主意。

我看过观察者模式,但我没能以不破坏单一职责原则的方式使用它。

您将如何处理我的应用程序中的事件监听器?您知道在 MS Office 等专业和复杂的应用程序或用 Java 编写的严肃程序中如何处理事件监听器吗?

package notepad;

import javax.swing.*;
import java.awt.event.*;
import listeners.MenuButtonListener;

public class Buttons extends MenuButtonListener {

// The menu buttons
private JMenuItem openFile, saveFile, saveAs, close;

// Get the saveFile field
public JMenuItem getSaveFile() {
return saveFile;
}

/**
* Creates the items of the file menu
* @return JMenu
*/
public JMenu createFileMenuItems() {

JMenu file = new JMenu("File");
openFile = new JMenuItem("Open");
saveFile = new JMenuItem("Save", KeyEvent.CTRL_MASK);
saveAs = new JMenuItem("Save as");
close = new JMenuItem("Close");

// Add the listener to the button
saveFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(saveFile, "Message");
}
});

saveFile.setMnemonic(KeyEvent.VK_T);
saveFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,
ActionEvent.CTRL_MASK));

file.add(openFile);
file.add(saveFile);
file.add(Separators.addSeparator());
file.add(saveAs);
file.add(close);

return file;

}

/**
* Creates the items of the edit menu
* @return JMenu
*/
public JMenu createEditMenuItems() {

JMenu edit = new JMenu("Edit");
JMenuItem cut = new JMenuItem("Cut");
JMenuItem copy = new JMenuItem("Copy");
JMenuItem paste = new JMenuItem("Paste");
JMenuItem find = new JMenuItem("Find");

edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.add(Separators.addSeparator());
edit.add(find);

return edit;
}

/**
* Creates the items of the format menu
* @return JMenu
*/
public JMenu createFormatMenuItems() {

JMenu format = new JMenu("Format");

return format;
}

/**
* Creates the items of the help menu
* @return JMenu
*/
public JMenu createHelpMenuItems() {
JMenu help = new JMenu("Help");

return help;
}

/**
* Gets the specified menu item
* @return JMenuItem
*/
public JMenuItem getMenuItem(JMenuItem menuItem) {
return menuItem;
}
}
// This class should be used to handle the event listeners
package listeners;

import javax.swing.*;
import java.awt.event.*;
import notepad.Buttons;

public class MenuButtonListener {

// Create an inner class for every button
public class SaveButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Buttons buttons = new Buttons();
JMenuItem saveButton = buttons.getSaveFile();
if (e.getSource() == saveButton) {
JOptionPane.showMessageDialog(saveButton, "Save");
}
}
}

public SaveButtonListener returnSaveButton() {
return new SaveButtonListener();
}


}

最佳答案

对于这种情况,您应该使用调解器模式,它将您的 UI 与 Controller (您的监听器)完全分离,非常好 example .

让我尝试将链接中的示例扩展到您的记事本应用程序。

你可以有一个命令,一个 Controller 用于你的“文件菜单”,它负责所有文件操作,如“新建”、“打开”等,另一个 Controller 用于你的“设置”菜单。现在,在创建菜单"file"时,您可以使用调解器注册它 registerView(JComponent component, String component_type),其中组件是 JMenu,component_type 是“FILE”,然后调解器可以将适当的 Controller 分配给 View ,这个 View 到 Controller 的映射可以是硬编码值(对于记事本,你可以把它放在里面说一张 map )或者可以从配置文件中读取(比如一个应用程序配置 xml,你可以在其中定义如下内容:

<application_config>
<view_controller_mapping>
<view_name>FILE</view_name>
<controller_name>FileController</controller_name><!--Optional-->
<controller_class>com.mycompany.notepad.view.controller.FileController</controller_class>
<!--Incase you want to give control to others to provide there own implementation -->
</view_controller_mapping>
</application_config>

希望这对您有所帮助。

关于java - 复杂应用程序中的事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8202778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com