簡體   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