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