gpt4 book ai didi

java - 将组件分成类

转载 作者:行者123 更新时间:2023-12-01 23:48:33 25 4
gpt4 key购买 nike

我正在创建一个“GUI”应用程序,目的是使代码清晰,并将这些“GUI”组件分成类(您将在下面看到我的意思),目前它与菜单栏配合得很好,但我现在想知道,因为我想向他们实现 ActionListener,最好在哪个类中执行,例如在菜单栏类的情况下,在他的类中或在 Main 中实现操作监听器,而不是实现抽象方法会使用我们想要执行操作的方法吗?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public final class Main extends JFrame {

private MenuBar menuBar;

public Main() {
setTitle("GUI");
setSize(300, 200);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);

initGUI();
}

public void initGUI() {
menuBar = new MenuBar(this);
// this is last update before I started posting this, I decided to
// access exitMenu variable and than to addActionListener to it from a here, which is currently not working
menuBar.exitMenu.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}

public static void main(String[] args) {
new Main();
}

}

菜单栏类:

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public final class MenuBar {

public JMenu newMenu;
public JMenu aboutMeMenu;
public JMenu exitMenu;

public MenuBar(JFrame jFrame) {
JMenuBar menubar = new JMenuBar();

initNew(menubar);
initAboutMe(menubar);
initExit(menubar);

jFrame.setJMenuBar(menubar);
}

public void initNew(JMenuBar menubar) {
newMenu = new JMenu("New");
menubar.add(newMenu);
}

public void initAboutMe(JMenuBar menubar) {
aboutMeMenu = new JMenu("About Me");
menubar.add(aboutMeMenu);
}

public void initExit(JMenuBar menubar) {
exitMenu = new JMenu("Exit");
menubar.add(exitMenu);
}


}

最佳答案

一种标准方法是让您的 Main 类或某个与 Main 相当“接近”的类来处理所有或大部分操作。通常会有一个基于 action.getActionCommand() 的巨大 switch 语句,将控制传递给适当的函数。我个人不喜欢这种方法,但它确实有一个优点,那就是相当容易遵循。

IMO 更好的方法是创建 AbstractActions并连接到他们。它们可以按照对您的应用程序有意义的任何方式进行组织。好处是它们封装得很好,感觉更像“OO”,等等......此外,多个 GUI 元素可以共享一个操作。例如按钮和菜单都可以调用“SaveFileAction”操作。并且可以集中启用和禁用操作。如果没有要保存的文件,则可以很容易地禁用“SaveFileAction”。

关于java - 将组件分成类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637894/

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