簡體   English   中英

ActionListener內的JFrame實例溢出

[英]Overflow on JFrame instance inside of ActionListener

我正在編寫的程序有問題。 我把你放在上下文中...

我嘗試在此程序中實現以下內容:MVC模式,因此,基本上,我將類放在不同的程序包中。

我有一個:視圖和控制器包,在視圖包中有: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();}}

UserInterface類:

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元素
  • 您可以通過簡單且線程安全的方式來訪問主機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM