繁体   English   中英

如何重用通用面板?

[英]How to reuse a common panel?

我有一个面板,用于将商品添加到购物车。 例如:

public class SomePanel extends JPanel {

    private static final long serialVersionUID = 1L;

    private JLabel firstLabel;
    private JLabel secondNameLabel;
    private JLabel thirdLabel;
    // and more..


    private JTextField firstTextField;
    private JTextField firstTextField;
    private JTextField thirdTextField;
    // and more..


    private void init() {
        firstLabel = new JLabel("First label");
        secondLabel = new JLabel("Second label");
        thirdLabel = new JLabel("Third label");     
        // and more..

        firstTextField = new JTextField("first field");
        secondTextField = new JTextField("second field");
        thirdTextField = new JTextField("third field");
        // and more..
    }

该面板位于对话框中。 当我在菜单中选择“添加”时,会出现一个对话框和此面板。 在那里我可以输入有关产品的信息并添加产品。

问题是我在主窗体上还有另外三个区域。 这些区域也显示与上面相同的面板。 我如何重用现有的SomePanel ,这是一个好习惯吗? 也许最好为每个元素( JLabelJTextField )创建单例? 也许有一些特殊的模式可以解决这个问题?

重用面板对象是一个很好的建议,它不仅适用于固定数量的字段,您也可以使用动态数量的字段。

您已经为 JPanel 创建了一个包装器,因此我们可以简单地向它添加一个方法来更新面板以显示新内容。 在这种情况下,我创建了一个新方法create(...)来更新内容。

例如,如果您有固定数量的字段,它可能如下所示:

public class SomePanel extends JPanel {

    private static final long serialVersionUID = 1L;
    
    final int labelHeight = 10;
    final int fieldHeight = 20;
    
    private JLabel firstLabel = createLabel("label 1", 0, 0);
    private JLabel secondLabel = createLabel("label 2", 0, 30);
    private JLabel thirdLabel = createLabel("label 3", 0, 60);
    
    // and more..
    private JTextField firstTextField = createField(null, 0, 10);
    private JTextField secondTextField = createField(null, 0, 40);
    private JTextField thirdTextField = createField(null, 0, 70);
    // and more..
    
    //New method to udpate the contents
    public boolean create(List<String> labels, List<String> textFields) {
        if(labels.size() != textFields.size()){
            System.out.println("Failed to update panel, there was a different number of labels and fields");
            return false;
        }
        
        //Update the fixed label and field values
        firstLabel.setText(labels.get(0));
        secondLabel.setText(labels.get(1));
        thirdLabel.setText(labels.get(2));

        firstTextField.setText(textFields.get(0));
        firstTextField.setText(textFields.get(1));
        firstTextField.setText(textFields.get(2));
        
        //Make sure that this panel is visiable after updating the values
        this.setVisible(true);
        
        //Success, return true
        return true;
    }
    
    //Remove the x and y depending on the layout manager
    private JLabel createLabel(String name, int x, int y){
        //Create label
        JLabel label = new JLabel(name);
        //Set location and size or use a layour manager
        label.setLocation(x, y);
        label.setSize(50, labelHeight);
        
        //Configure cutsom label settings
        //label.setFont(...);
        //label.setBorder(...);
        
        //return the custom label
        return label;
    }
    
    //Remove the x and y depending on the layout manager
    private JTextField createField(String content, int x, int y) {
        //Create label
        JTextField field = new JTextField();
        if(content != null){
            field.setText(content);
        }
        //Set location and size or use a layour manager
        field.setLocation(x, y);
        field.setSize(80, fieldHeight);
        
        //Configure cutsom text field settings
        //field.setFont(...);
        //field.setBorder(...);
        
        //return the custom field
        return field;
    }
}

或者,如果您想使用具有灵活数量标签和字段的动态内容,您可以执行以下操作:

public class SomePanel extends JPanel {

    private static final long serialVersionUID = 1L;
    final int labelHeight = 10;
    final int fieldHeight = 20;
    final int padding = 5;

    //Keep a list of contents only if you need to edit/retreive data from the panel
    private List<JTextField> fieldList = new ArrayList<>();

    //New method to udpate the contents
    public boolean create(List<String> labels, List<String> textFields) {
        if(labels.size() != textFields.size()){
            System.out.println("Failed to update panel, there was a different number of labels and fields");
            return false;
        }

        //remove previous components
        this.removeAll();

        //reset the dynamic lists (For if you need to edit/retreive data from the panel)
        fieldList = new ArrayList<>();

        //placement values (remove these if using a layout manager)
        int xPos = 0;
        int yPos = 0;

        //Update the lists based on the new values
        for (int count = 0; count < labels.size(); count++) {
            //Create and add labels
            JLabel dynamicLabel = createLabel(labels.get(count), xPos, yPos);
            this.add(dynamicLabel);
            //update placement location, remove if you use a layout manager
            yPos += labelHeight + padding;

            //Create and add fields
            JTextField dynamicField = createField(textFields.get(count), xPos, yPos);
            this.add(dynamicLabel);
            //update placement location, remove if you use a layout manager
            yPos += fieldHeight + padding;

            //Store fields in a list so that we can retreive the contents later if needed, or if 
            fieldList.add(dynamicField);
        }
        
        //Make sure that this panel is visiable after updating the values
        this.setVisible(true);
        
        //Success, return true
        return true;
    }
    
    //Remove the x and y depending on the layout manager
    private JLabel createLabel(String name, int x, int y){
        //Create label
        JLabel label = new JLabel(name);
        //Set location and size or use a layour manager
        label.setLocation(x, y);
        label.setSize(50, labelHeight);
        
        //Configure cutsom label settings
        //label.setFont(...);
        //label.setBorder(...);
        
        //return the custom label
        return label;
    }
    
    //Remove the x and y depending on the layout manager
    private JTextField createField(String content, int x, int y) {
        //Create label
        JTextField field = new JTextField();
        if(content != null){
            field.setText(content);
        }
        //Set location and size or use a layour manager
        field.setLocation(x, y);
        field.setSize(80, fieldHeight);
        
        //Configure cutsom text field settings
        //field.setFont(...);
        //field.setBorder(...);
        
        //return the custom field
        return field;
    }
    
    //Method to get the current field contents if needed or if edited by the user
    public List<JTextField> getCurrentFieldContent (){
        return fieldList;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM