我的问题是
如果我有一个Jpanel,有一些JtextField和ComboBox。另一个JPanel包含保存、更新、清除和退出等按钮。
JFrame和BoarderLayout都添加了JPanel。
如果我在文本字段中写入内容并按下保存按钮,它将把数据保存到数据库中。我知道数据库的连接代码。
问题是文本面板和按钮面板之间的连接。如果我公开JTextField和JButton,我可以在JFrame中访问它们,并实现监听器将数据保存到数据库中,但我想这不是正确的做法。
请指导我如何正确地做这件事。
这是测试代码。
按钮面板:
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);
}
}
Jframe
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);
}
});
}
}
使用方法来访问或修改(setters和getters)属性,作为示例,将此方法放在Button类中:
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);
}
});
隔离特定实现中使用的组件是一种很好的做法。你可以专注于每个JPanel的角色。TextPanel的作用是接收Id和Name的文本输入,按钮JPanel的作用是触发特定操作。
实现这一点的一个简单方法是,不要直接访问JButton和JTextField组件(要么公开它们,要么通过getter),而是在TextPanel类中创建一个getter,返回一个用于id的String和另一个用于name的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和一个触发所选操作的应用按钮。或者如果您将文本面板更改为提供o JComboBox而不是简单的JTextField。在任何这些情况下,您都必须更改代码中使用按钮或文本面板类来使用新屏幕设计的所有位置。
架构设计 整个功能架构如下图所示。 包括三大组件:区块链服务(Blockchain)、链码服务(Chaincode)、成员权限管理(Membership)。 概念术语 Auditability(审计性):在一定权限和许可下,可以对链上的交易进行审计和检查。 Block(区块):代表一批得到确认的交易信息的整体,准备被共识加入到区块链中。 Blockchain(区块链):由多个区块链接而成的链表结构
适用场景 最终一致 单向同步 实现依据 MQ消息顺序消费 MQ消息组内消息最多被消费一次 仅支持DML,DDL、DCL手工执行 表必须有主键、最后更新时间 系统架构 Node节点内存模型 TaskController 1---* TaskWorker TaskWorker 1---* TaskWork TaskWork 1---1 *Job 通俗上讲TaskController对应Node进程,进
Angel的架构设计 Angel的整体设计比较简约,层次鲜明,容易上手,没有过多复杂的设计,关注模型和机器学习相关特性,追求高维度模型下的最佳性能。它的架构设计,从整体可以分为3大模块: Parameter Server层:提供通用的参数服务器服务,负责模型的分布存储,通讯同步和协调计算,并通过PSAgent提供PS Service Worker层: 基于Angel自身模型设计的分布式运行节点,自
任何优秀的项目都离不开优秀的架构设计。本小节将介绍 Kubernetes 在架构方面的设计考虑。 基本考虑 如果让我们自己从头设计一套容器管理平台,有如下几个方面是很容易想到的: 分布式架构,保证扩展性; 逻辑集中式的控制平面 + 物理分布式的运行平面; 一套资源调度系统,管理哪个容器该分配到哪个节点上; 一套对容器内服务进行抽象和 HA 的系统。 运行原理 下面这张图完整展示了 Kubernet
本文向大家介绍Dubbo的架构设计?相关面试题,主要包含被问及Dubbo的架构设计?时的应答技巧和注意事项,需要的朋友参考一下 Dubbo框架设计一共划分了10个层: 服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。 配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心。 服