gpt4 book ai didi

java - 更改 JMenuItem 上的 JPanel 单击(ActionListener 未触发)

转载 作者:行者123 更新时间:2023-12-01 10:01:49 24 4
gpt4 key购买 nike

这里是 Java 新手。我正在为我的企业使用构建一个群发邮件程序(像 Mailchimp 这样的服务,每次发送我需要的大小的邮件,收费高达 250 美元)。现在,我正在为该程序设计 GUI。所有电子邮件发送代码已完成并经过测试。

我有 JMenuItems 使用 ActionListeners 来调用另一个类,这有助于 JPanel 的切换。我听说 CardLayout 是一种更简单的方法,但我想从头开始学习它,可以这么说,这样我就可以编写更多代码片段来提高办公室的效率。

在我的代码中,类 MenuAction 设置 JPanel 面板 == 与每个菜单项关联的面板,然后运行 ​​changePanel 方法以方便 JFrame 的交换和重新渲染。或者从理论上讲,这就是我认为会发生的情况。我搞砸了什么?有没有办法在不使用卡片布局的情况下执行此功能?

import java.lang.*;

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

import java.awt.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;


public class EBlast extends JFrame{
EBlast(){

/*Create Frame*/

JFrame f = new JFrame("Email Blaster 1.0");
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

/*Create Menu Bar Buttons*/

JMenuBar mainmenu = new JMenuBar();
JMenu jmHome = new JMenu("Home");
JMenu jmOptions = new JMenu("Options");
JMenuItem jmiNew = new JMenuItem("New");
JMenuItem jmiSent = new JMenuItem("Sent");
jmOptions.add(jmiNew);
jmOptions.add(jmiSent);
JMenu jmMailer = new JMenu("Mailer");
JMenuItem jmiTrans = new JMenuItem("Transmission Status");
JMenuItem jmiStop = new JMenuItem("Stop");
jmMailer.add(jmiTrans);
jmMailer.add(jmiStop);
JMenu jmEmailList = new JMenu("Email Lists");
JMenuItem jmiNewList = new JMenuItem("New List");
JMenuItem jmiSavedList = new JMenuItem("Saved Lists");
JMenuItem jmiDoNot = new JMenuItem("Do Not Email List");
jmEmailList.add(jmiNewList);
jmEmailList.add(jmiSavedList);
jmEmailList.add(jmiDoNot);

/*Define Panels*/

JPanel jpMain = new JPanel();
jpMain.setBackground(Color.BLACK);
JPanel jpNew = new JPanel();
jpNew.setBackground(Color.RED);
JPanel jpSent = new JPanel();
jpSent.setBackground(Color.BLUE);
JPanel jpTrans = new JPanel();
jpTrans.setBackground(Color.ORANGE);
JPanel jpStop = new JPanel();
jpStop.setBackground(Color.WHITE);
JPanel jpNewList = new JPanel();
jpNewList.setBackground(Color.YELLOW);
JPanel jpSavedList = new JPanel();
jpSavedList.setBackground(Color.GREEN);
JPanel jpDoNot = new JPanel();
jpDoNot.setBackground(Color.PINK);

/*Add Menu Bar Buttons*/

mainmenu.add(jmHome);
mainmenu.add(jmOptions);
mainmenu.add(jmMailer);
mainmenu.add(jmEmailList);

/*Redirect MenuBar Clicks to class MenuAction*/

jmiNew.addActionListener(new MenuAction(jpNew));
jmiSent.addActionListener(new MenuAction(jpSent));
jmiTrans.addActionListener(new MenuAction(jpTrans));
jmiStop.addActionListener(new MenuAction(jpStop));
jmiNewList.addActionListener(new MenuAction(jpNewList));
jmiSavedList.addActionListener(new MenuAction(jpSavedList));
jmiDoNot.addActionListener(new MenuAction(jpDoNot));

/*Fill and Render JFrame*/

f.setJMenuBar(mainmenu);
f.setVisible(true);
f.setLayout(new BorderLayout());

}

public class MenuAction implements ActionListener{

JPanel panel;
MenuAction(JPanel pnl){
this.panel = pnl;
}
@Override
public void actionPerformed(ActionEvent e){
changePanel(panel);
}
}

public void changePanel(JPanel panel) {
getContentPane().removeAll();
getContentPane().add(panel, BorderLayout.CENTER);
getContentPane().doLayout();
update(getGraphics());

repaint();
revalidate();
}

public void actionPerformed(ActionEvent ae) {
String comStr = ae.getActionCommand();
System.out.println(comStr + " Selected");
}

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

最佳答案

问题是您的代码有 2 个 JFrame。

  1. 您的类"is"JFrame。

  2. 在类的构造函数中,您创建一个新的 JFrame 并将所有组件添加到该框架中,然后该框架将变得可见。

但是,您的 ActionListener 尝试更新在任何地方都不可见的 JFrame 类。

您的类不应该扩展 JFrame。

一种方法(不是最好的方法)是将 JFrame 作为参数传递给 MenuAction,以便 Action 可以访问该框架。那么changePanel(...) 方法应该是MenuAction 的一部分。也就是说Action的代码应该完全包含在Action中。

此外,从可见 GUI 添加/删除组件的基本代码是:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();

所以基本上,整个类都应该重新设计。这就是为什么你首先要学会以标准方式做事。专注于基础知识,而不是噱头。

关于java - 更改 JMenuItem 上的 JPanel 单击(ActionListener 未触发),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755941/

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