任何人都可以建议替代这些类似的JPanel构造函数吗?

时间:2014-05-12 18:04:08

标签: java swing

我有一个包含许多面板的主JFrame。在这个JFrame中,每个面板都需要能够访问的方法和变量,所以我一直将框架本身传递给所有这些框架的构造函数。

pnlLogin = new LoginPanel(this);
pnlMainMenu = new MainMenuPanel(this);
pnlSalesMenu = new SalesMenuPanel(this);
pnlPaymentMenu = new PaymentMenuPanel(this);
pnlAddCash = new AddCashPanel(this);
pnlAddCredit = new AddCreditPanel(this);
pnlAddCheck = new AddCheckPanel(this);
pnlSaleComplete = new SaleCompletePanel(this);
pnlProductMenu = new ProductMenuPanel(this);
pnlAddProd = new AddProdPanel(this);
pnlUpdateProd = new UpdateProdPanel(this);
pnlEmployeeMenu = new EmployeeMenuPanel(this);
pnlAddEmp = new AddEmpPanel(this);
pnlUpdateEmp = new UpdateEmpPanel(this);

然后参考像这样的

面板中的JFrame变量和方法
frmMain.frameMethod();
frmMain.frameVariable = x;

我意识到静态方法和变量可以完成这样的事情并允许我在面板中引用它们,但这不适合我的应用程序需求。 谁能建议更好的方法呢?

2 个答案:

答案 0 :(得分:3)

您可以使用将返回父窗口的SwingUtilities.getWindowAncestor(...)SwingUtilities.getRoot(x)方法。

JFrame parent= (JFrame) SwingUtilities.getWindowAncestor(this);

其中this指的是单个面板。

JFrame parent= (JFrame)SwingUtilities.getRoot(panel);

答案 1 :(得分:1)

你不应该使用静态。虽然,Swing对代码非常糟糕。最佳实践也更加冗长,因为您应该对所有组件使用单例模式,以便它们可以延迟加载(最佳性能)。例如:

private JPanel myPanel;

public JPanel getMyPanel() {
    if (myPanel == null) {
        myPanel = new JPanel(this);
    }
    return myPanel;
}

这样,您可以在需要时销毁面板,并确保在需要时可以使用新面板。此外,只有在您需要时才会加载此组件,而不是之前(最佳内存管理)。

所以,要真正回答你的问题,你没有太多方法可以做得更好。

最后一件事:确保使用getter和setter来访问其他类变量。

frmMain.frameVariable = x;

应该是

frmMain.setFrameVariable(x);