当前位置: 首页 > 知识库问答 >
问题:

ActionListener内部JFrame实例溢出

南宫奇思
2023-03-14

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

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

我有一个:视图和控制器包,在视图包中我有:UserInterface类,它扩展了JFrame,并包含:JMenuBar、jMenus和JMenuItem。。。

你可以用JMenuItem添加标签,这个JMenuItem,获取并添加一个: ActionListener,这个actionlistener来自另一个类,这个类是: Item,并实现一个actionlistener,这个actionlistener创建一个标签,并添加到JFrame。

最后,主类只需调用UserInterface并运行程序。

问题是。。。在实现ActionListener的:Item类中,我需要创建一个:UserInterface类的实例,以添加选项卡,但当我这样做并运行程序时,添加了选项卡,但每次单击JFrame时,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);}}

有人能帮我解决这个问题吗?,或者?给我一个主意?希望有人能帮助我,我真的很感谢你的时间,问候。

共有1个答案

李勇
2023-03-14

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

根据乔什·布洛赫的建议(http://www.informit.com/articles/article.aspx?p=1216151

public enum UserInterface {
APP;

private JFrame frame = new JFrame();

...

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

...
}

在项目类中:

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

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

  • 主类不应扩展JFrame。这样,您就有了更细粒度的设计,如果需要重新设计,您可以轻松地组合UI元素
 类似资料:
  • 我是一个初学者,我写了这个代码,但它似乎不起作用。我运行代码,框架不出现idk为什么。 我还有一个主要方法: (班级名称是匈牙利语不看)

  • 我在一个java应用程序上工作。我想在箭头键上实现一个KeyListener。我有一个扩展JFrame并实现ActionListener的类

  • 问题内容: 我有一个实用程序方法,当从中删除了不相关的逻辑时,简化的方法将如下所示: 问题是,如果是诸如的内部类,则该方法即使是公共方法也将不起作用,因为它将抛出。 有没有办法动态实例化内部类? 问题答案: 如果它是真正的 内部 类而不是 嵌套 (静态)类,则有一个隐式构造函数参数,它是对外部类实例的引用。在那个阶段您不能使用- 必须获得适当的构造函数。这是一个例子:

  • 实例内部类是指没有用 static 修饰的内部类,有的地方也称为非静态内部类。示例代码如下: 上述示例中的 Inner 类就是实例内部类。实例内部类有如下特点。 1) 在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。 2)在实例内部类中,可以访问外部类的所有成员。 提示:如果有多层嵌套,则内部类可以访问所有外部类的成员。 3)在外部类中不能直接访问内部类的成员,而必

  • 我试图改变graphstream中图形的大小,但它失败了,甚至变得很小。 这是我的代码。起初,我无法设置窗口标题,所以我唯一的选择是创建一个JFRAMe并将视图嵌入其中。因此,如果有一个选项可以设置图表的标题,我将不胜感激。 这是我的代码。 编辑 即使应用了提议的改变,它也不起作用。 public Clicks()抛出中断异常{System.setProperty(“org.graphstream