繁体   English   中英

Java设计架构

[英]Java Design Architecture

我的问题是

如果我有一个Jpanel有一些JtextField和ComboBox。 另一个JPanel包含诸如保存,更新,清除,退出之类的按钮。

将JPanel都添加到JFrame中,并通过BoarderLayout添加。

如果我在文本字段中写一些东西,然后按保存按钮,它将把数据保存到数据库中。 我知道数据库的连接代码。

问题是文本面板和按钮面板之间的连接。 如果我将JTextField和JButtons设为公共,则可以在JFrame和Implements Listners中访问它们,以将数据保存到数据库中,但是我认为这样做是不正确的。

请指导我如何正确地做。

这是测试代码。

按钮面板:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Buttons extends JPanel{

    JButton btnSave, btnUpdate, btnClear, btnExit;

    public Buttons(){

        btnSave = new JButton("Save");
        btnUpdate = new JButton("Update");
        btnClear = new JButton("Clear");
        btnExit = new JButton("Exit");


        setLayout(new FlowLayout());

        add(btnSave);
        add(btnUpdate);
        add(btnClear);
        add(btnExit);

        setSize(100,100);     

    }    
} 

文字面板

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author Aqeel
 */
public class textPanel  extends JPanel{

    JLabel ID , Name;
    JTextField txtID, txtName;

    GridBagConstraints gridBagConstraints;

    public textPanel(){

        ID = new JLabel("ID:");
        Name = new JLabel("Name:");

        txtID = new JTextField(10);
        txtName = new JTextField(10);


        setLayout(new GridBagLayout());


        add(ID, new GridBagConstraints());
        add(txtID, new GridBagConstraints());

        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        add(Name, gridBagConstraints);


        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        add(txtName, gridBagConstraints);

        setSize(300,200);
    }

}

框架

 import java.awt.BorderLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import javax.swing.JFrame;
 import javax.swing.UnsupportedLookAndFeelException;
 import org.openide.util.Exceptions;
 /**
  *
  * @author Aqeel
  */
 public class Jframe extends JFrame
 {
  textPanel textpanel;
  Buttons buttons;

  public Jframe() {

   textpanel = new textPanel();
   buttons = new Buttons();

   setLayout(new BorderLayout());

   add(textpanel, BorderLayout.CENTER);
   add(buttons, BorderLayout.SOUTH);

   setSize(400, 200);

   buttons.btnSave.addActionListener(new ActionListener()
   {
    @Override
    public void actionPerformed(ActionEvent e) {
     String ID = textpanel.txtID.getText();
     String Name = textpanel.txtName.getText();

     System.out.println(ID);
     System.out.println(Name);
    }
   });

   buttons.btnExit.addActionListener(new ActionListener()
   {
    @Override
    public void actionPerformed(ActionEvent e) {
       System.exit(0);
    }
   });
  }

  public static void main(String args[]) 
   throws ClassNotFoundException, InstantiationException, UnsupportedLookAndFeelException
   {

   try {
    for (javax.swing.UIManager.LookAndFeelInfo info : 
      javax.swing.UIManager.getInstalledLookAndFeels()
    ) {
     if ("Nimbus".equals(info.getName())) {
      javax.swing.UIManager.setLookAndFeel(info.getClassName());

      break;
     }
    }
   } catch (IllegalAccessException ex) {
    Exceptions.printStackTrace(ex);
   }
   java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
     new Jframe().setVisible(true);
    }
   });
  }
 }

隔离特定实现中使用的组件是一个好习惯。 您可以专注于每个JPanel的角色。 TextPanel具有接收Id和Name的文本输入的作用,而Buttons JPanel具有触发特定动作的作用。

一种简单的方法是,而不是直接访问JButton和JTextField组件(将它们公开或由getter进行访问),在TextPanel类中创建一个getter,该id返回一个ID字符串和另一个String名称。

public class textPanel  extends JPanel{

    JLabel ID , Name;
    JTextField txtID, txtName;
    ...    
    public String getId()
    {
        return txtID.getText();
    }

    public String getName()
    {
        return txtName.getText();
    }
}

对于Buttons类,为每个操作创建一个带有methodos的接口。

public class Buttons extends JPanel{

    private JButton btnSave, btnUpdate, btnClear, btnExit;
    private ButtonsActions actionsListener;

    public Buttons(ButtonsActions actionsListener){
       this.actionsListener = actionsListener;

       btnSave.addActionListener(new ActionListener()
          {
           @Override
           public void actionPerformed(ActionEvent e) {
                actionsListener.onSave();
           }
          });
       ...
    }

    public interface ButtonsActions {
        public void onSave();
        public void onUpdate();
        public void onClear();
        public void onExit();
    }
}

然后,Jframe类将能够实现此接口并在单击按钮时对动作做出反应。

将实现与每个面板隔离的原因之一是,假设您稍后更改“按钮”面板,使其具有一个JRadioButton,其中列出了所有动作选项,并带有一个应用按钮来触发所选动作。 或者,如果您更改TextPanel以提供JComboBox而不是简单的JTextField。 在任何一种情况下,您都必须更改使用Buttons或TextPanel类的代码中的所有位置,以使用新的屏幕设计。

使用方法来访问或修改(setter和getters)属性,例如,将此方法放在Buttons类中:

public JButton getbtnSave()
{
   return this.btnSave;
}

该代码用于通过私有访问修饰符获取btnSave。 并使用一种方法来获取txtID(将其放置在textPanel类中)

public JTextField getTxtID()
{
   return this.txtID;
}

public JTextField getTxtName()
{
    return this.txtName;
}

因此,JFrame中的代码将是

  buttons.btnSave.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String ID = textpanel.getTxtID().getText();
            String Name = textpanel.getTxtName().getText();

            System.out.println(ID);
            System.out.println(Name);
        }
    });

暂无
暂无

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

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