[英]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.