Java - 处理大型GUI构造函数的最佳方法?

时间:2015-02-10 17:18:37

标签: java user-interface constructor

我发现在用Java编写gui应用程序时,如果我不将它抽象/提取到其他类或方法来缩短它,那么我的GUI类的构造函数会变得很长...什么是最好/最逻辑/最少处理大型gui构造函数的凌乱方式?我已经收集了两种最常用的方法来解决这个问题......什么是最好的方法,更重要的是,为什么/为什么不呢?

方法1,为每个gui组件组织类,其中每个类扩展其GUI组件:

public class GUI extends JFrame{
public GUI(String title){
    super(title);
    this.setVisible(true);
    this.setLayout(new GridBagLayout());
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(500,500);
    this.add(new mainPanel());
}
private class mainPanel extends JPanel{
    private mainPanel(){
        this.setSize(new Dimension(500,500));
        this.setLayout(new BorderLayout());
        this.add(new PlayButton("Play Now"));
    }
    private class PlayButton extends JButton{
        private PlayButton(String text){
            this.setText(text);
            this.setSize(150,50);
            this.setBackground(Color.WHITE);
            this.setForeground(Color.BLACK);
        }
    }
}
}

方法2:使用初始化方法和返回每个gui组件实例的方法:

public class GUI extends JFrame{
public GUI(String title){
    super(title);
    this.setVisible(true);
    this.setLayout(new GridBagLayout());
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(500,500);
    initGuiComponents();
}

private void initGuiComponents(){
    this.add(mainPanel());
}
private JPanel mainPanel(){
    JPanel mainPanel = new JPanel();
    mainPanel.setSize(new Dimension(500,500));
    mainPanel.setLayout(new BorderLayout());
    mainPanel.add(playButton("Play Now"));
    return mainPanel;
}

private JButton playButton(String text){
JButton button = new JButton();
button.setText(text);
button.setSize(150,50);
button.setBackground(Color.WHITE);
button.setForeground(Color.BLACK);
return button;
    }
}

3 个答案:

答案 0 :(得分:0)

我认为使用两者的结合将是一个好主意。

使用顶级类可以使代码更易于维护,而不是使用内部类。您可以根据功能和责任将框架划分为小面板。如果你的隔离是足够好的,它们将是松散耦合的,你不需要传递许多参数。

同时,如果构造函数或任何方法的比例增长,将紧密相关的操作粘贴到私有方法中可能有助于使代码可读。


美丽的程序源于高质量的抽象和封装。

即使实现了这些需求的实践和经验,坚持SOLID principles始终是您的首要任务。

希望这有帮助。
祝你好运。

答案 1 :(得分:0)

或许考虑使用builder pattern

答案 2 :(得分:0)

如果您在许多组件上使用相同的设置(即每个Button具有相同的BG / FG颜色),请使用工厂:

class ComponentFactory{
    static JButton createButton(String text) {
        JButton button = new JButton();
        button.setBackground(Color.WHITE);
        button.setForeground(Color.BLACK);
    }
}

然后,在构造函数中,您可以调整非常量设置:

JButton button = ComponentFactory.createButton();
button.setText(text);
[...]

这样做的好处是您只需更改一次设置(如BG颜色)即可更改所有按钮的外观。

为了保持构造函数的简短,我通常会将流程拆分为createChildren()layoutComponents()registerListeners()以及其他可能有用的东西。然后,我从抽象超类中的构造函数中调用这些方法。因此,许多子类根本不需要构造函数 - 或者是一个非常短的调用super()并执行一些自定义设置。