我想创建一个将由所有其他面板使用的常见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,因为它是从超类构造函数调用的。有一个更好的方法吗?任何帮助表示赞赏。
答案 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);
}
}
此面板可以有自己的布局和组件