JPanel的常用模板

时间:2014-02-14 05:03:18

标签: java swing user-interface jpanel

我想创建一个将由所有其他面板使用的常见JPanel模板。 Common JPanel Template有一个共同的页眉和页脚。下面是公共模板JPanel的示例代码。

import javax.swing.*;
public abstract class AbstractPanel extends JPanel {
    public AbstractPanel() {
        super();
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        init();
        addHeader();
        addComponentsToScreen();
        addFooter();
    }

    private void addHeader() {
        add(new JLabel("Common Header"));
    }

    private void addFooter() {
        add(new JLabel("Common Footer"));
    }

    protected abstract void init();
    protected abstract void addComponentsToScreen();
}

现在我想使用这个AbstractPanel创建一个JPanel,它有两个不同的布局,基于输入参数。

import javax.swing.*;
public class MyPanel extends AbstractPanel {
    private boolean showDept;
    private JTextField jTextEmp;
    private JTextField jTextName;
    private JTextField jTextDept;
    public MyPanel(boolean showDept) {
        super();
        this.showDept = showDept;
    }

    protected void init() {
        jTextEmp = new JTextField();
        jTextName = new JTextField();
        jTextDept = new JTextField();
    }

    protected void addComponentsToScreen() {
        add(new JLabel("Employee"));
        add(jTextEmp);
        add(new JLabel("Name"));
        add(jTextName);
        if(showDept) {
            add(new JLabel("Dept"));
            add(jTextDept);
        }
    }

    public static void main(String[] args) {
        JFrame window = new JFrame();
        window.add(new MyPanel(true));
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(200, 500);
        window.setVisible(true);
    }
}

上面代码的问题是,对于addComponentsToScreen方法,showDept总是为false,因为它是从超类构造函数调用的。有一个更好的方法吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

使您的超类构造函数成为参数化构造函数,并将showDept传递给超类构造函数。

示例代码:

import javax.swing.*;
public abstract class AbstractPanel extends JPanel {
 private boolean showDept; // add public getter for it
    public AbstractPanel(boolean showDept) {
        super();
        this.showDept = showDept;
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        init();
        addHeader();
        addComponentsToScreen();
        addFooter();
    }

    private void addHeader() {
        add(new JLabel("Common Header"));
    }

    private void addFooter() {
        add(new JLabel("Common Footer"));
    }

    protected abstract void init();
    protected abstract void addComponentsToScreen();
}

MyPanel课程:

import javax.swing.*;
public class MyPanel extends AbstractPanel {
    private boolean showDept;
    private JTextField jTextEmp;
    private JTextField jTextName;
    private JTextField jTextDept;
    public MyPanel(boolean showDept) {
        super(showDept);
    }

    protected void init() {
        jTextEmp = new JTextField();
        jTextName = new JTextField();
        jTextDept = new JTextField();
    }

    protected void addComponentsToScreen() {
        add(new JLabel("Employee"));
        add(jTextEmp);
        add(new JLabel("Name"));
        add(jTextName);
        if(getShowDept()) {
            add(new JLabel("Dept"));
            add(jTextDept);
        }
    }

    public static void main(String[] args) {
        JFrame window = new JFrame();
        window.add(new MyPanel(true));
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(200, 500);
        window.setVisible(true);
    }
}

答案 1 :(得分:0)

其他方面,让您的面板完全独立于彼此。因为这个应用程序基本你想要在非常视图上保持相同的页眉和页脚,你可以使用以下。

    class MyDynamicPanel extends JPanel {
    public MyDynamicPanel() {
        super();
        setLayout(new BorderLayout());
        addAppHeader();
        addAppFooter();
    }

    private void addAppHeader() {
        add(new JLabel("Common Header"),BorderLayout.NORTH);
    }
    public void addAppCenter(JPanel centerPanel){
        add(centerPanel,BorderLayout.CENTER);
    }
    private void addAppFooter() {
        add(new JLabel("Common Footer"),BorderLayout.SOUTH);
    }
}

这使用边框布局在每种尺寸的屏幕或框架中调整自身。 现在是您的自定义面板。

   public class MyPanel extends MyDynamicPanel {
    private JTextField jTextEmp;
    private JTextField jTextName;
    private JTextField jTextDept;
    private JPanel centerPanel;
    public MyPanel() {
        super();
        init();
        addComponentsToScreen();
    }

    protected void init() {
        centerPanel = new JPanel();
        jTextEmp = new JTextField("",20);
        jTextName = new JTextField("",20);
        jTextDept = new JTextField("",10);
    }

    protected void addComponentsToScreen() {
       centerPanel.add(new JLabel("Name"));
       centerPanel.add(jTextEmp);
       centerPanel.add(new JLabel("Employee"));
       centerPanel.add(jTextName);
       centerPanel.add(new JLabel("dept"));
       centerPanel.add(jTextDept);

       addAppCenter(centerPanel);
    }

    public static void main(String[] args) {
        JFrame window = new JFrame();
        window.add(new MyPanel());
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(200, 500);
        window.setVisible(true);
    }
}

此面板可以有自己的布局和组件