【问题标题】:Overflow on JFrame instance inside of ActionListenerActionListener 内部的 JFrame 实例溢出
【发布时间】:2018-04-10 09:55:09
【问题描述】:

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

我尝试在这个程序中实现:MVC 模式,所以,基本上,我将类分开,放在不同的包中。

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

可以用JMenuItem添加标签,这个JMenuItem,获取并添加一个:ActionListener,那个actionlistener来自另一个类,这个类是:Item,并实现了一个actionlistener,这个actionlistener创建一个tab,并添加到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);}}

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

【问题讨论】:

    标签: java methods jframe stack-overflow actionlistener


    【解决方案1】:

    在这样的问题中,我会避​​免创建您的类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 元素
    • 您可以通过简单且线程安全的方式修复对主框架的访问。

    【讨论】:

    • 在我的 main 方法中如何实现 Enum 类以及如何在 UserInterface 类中构造它有点难以理解,我不得不对代码进行一些更改,并创建另一种方法,最后,我可以解决问题,感谢您的解释,它对我帮助很大,真的,非常感谢,我还需要阅读更多关于:Enum 类的信息。感谢您的阅读时间,并帮助我,问候。
    • 一直在寻找合适的链接,我正在用它更新答案:D
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 2012-06-07
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多