java - ActionListener 内的 JFrame 实例溢出

标签 java methods jframe stack-overflow actionlistener

我正在编写的程序存在问题。 我把你放在上下文中......

我尝试在这个程序中实现:MVC 模式,因此,基本上,我将类分离在不同的包中。

我有一个: View 和 Controller 包,在 View 包中我有:UserInterface类,它扩展了JFrame,并包含:JMenuBar,JMenu和JMenuItem...

可以用JMenuItem添加选项卡,这个JMenuItem,获取并添加一个:ActionListener,那个actionlistener来自另一个类,这个类是:Item,并且实现了一个actionlistener,这个actionlistener创建一个选项卡,并添加到JFrame中.

最后,在 Main 类中,只需调用 UserInterface 并运行程序即可。

问题是这样的...在实现 ActionListener 的 Item 类中,我需要创建 UserInterface 类的实例,以便可以添加选项卡,但是当我这样做并运行程序时,添加了选项卡,但是每次点击 JFrame 就开始溢出,我指的是多次打开、打开、打开 JFrame。

我知道发生这种情况是因为我在实现 ActionListener 的类中创建了一个实例,但我无法修复。

对我来说最逻辑的是在actionlistener方法之外创建UserInterface的实例,只是为了调用实例的标识符,并将选项卡添加到用户界面,但没有任何效果。

我花了很多时间试图解决这个问题,但我不能...... 这样做的目的是解决问题,并避免JFrame的溢出,我指的是仅将选项卡添加到框架中,并解决多个打开框架的问题。

代码:

主类:

package controller;
import view.*;

public class Main{

public void InvokeMain(){
UserInterface ui = new UserInterface();}

public static void main(String args []){

Main m = new Main();
m.InvokeMain();}}

用户界面类:

package view;
import controller.*;
import javax.swing.*;

public class UserInterface extends JFrame{
private static final long serialVersionUID = 1L;
public JMenuBar navbar = new JMenuBar();
public JMenu file = new JMenu("File");
public JMenuItem tab = new JMenuItem("Tab");

public UserInterface(){
Item action = new Item();
setSize(800, 400);
setDefaultCloseOperation(UserInterface.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setJMenuBar(navbar);
setVisible(true);

file.add(tab);
tab.addActionListener(action);
navbar.add(file);}}

项目类别:

package controller;
import view.*;
import javax.swing.*;
import java.awt.event.*;

public class Item implements ActionListener{
public static JTabbedPane tabs = new JTabbedPane(); 

public void actionPerformed(ActionEvent A){
UserInterface user = new UserInterface();
tabs.addTab("untitled", null, null, "untitled");
user.add(tabs);}}

¿有人可以帮我解决这个问题吗?或者 ¿给我一个主意? 希望有人能帮助我,非常感谢您的时间,问候。

最佳答案

在这样的问题中,我会避​​免创建类UserInterface的新实例。相反,我会将其定义为单例对象,并通过您的应用程序访问它。

按照 Josh Bloch 的建议 ( http://www.informit.com/articles/article.aspx?p=1216151&seqNum=3 ),我将使用枚举来实现 UserInterface:

public enum UserInterface {
APP;

private JFrame frame = new JFrame();

...

public addTab(JTabbedPane tabs) {
   this.frame.add(tabs);
}

...
}

在你的 Item 类中:

...
public void actionPerformed(ActionEvent A){
tabs.addTab("untitled", null, null, "untitled");
UserInterface.APP.addTab(tabs);}}
...

这会迫使您重新构建应用程序,但它有很多优点:

  • 您的主类不应扩展 JFrame。这样,您就可以拥有更细粒度的设计,以便在需要重新设计时轻松组合 UI 元素
  • 您可以通过一种简单且线程安全的方式修复对主框架的访问。

关于java - ActionListener 内的 JFrame 实例溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49750652/

相关文章:

java - 使用 CommonsMultipartResolver 测试最大上传大小时“未找到多部分边界”

java - 继承场景下引用和对象的关系

java - 获取 Apache Lucene 中的字段类型

java - Java 中是否可以将数字数据类型转换为字符串输出?

java - 图像未显示在 Java Swing GUI JFrame 中

java - 在由 Maven 驱动的简单演示应用程序的 JAR 中包含 Postgres 的 JDBC 驱动程序

c# - 如何在 C# 解决方案中查找所有方法

java - Java 泛型方法的返回类型

java - 我想在新框架窗口出现时隐藏第一帧

java - 如何制作 JFrame/JPanel "Modal",以便在关闭窗口或按下按钮之前不会继续输入?