Java NetBeans GUI与JADE多智能体系统通信实现问询
实现Java GUI与JADE智能体的通信
要实现GUI与JADE智能体的通信,核心是利用JADE的ACL消息机制(Agent Communication Language)——这是JADE智能体间及外部程序与智能体通信的标准方式。以下是针对你现有代码的修改方案:
步骤1:更新Agent类,添加消息接收与处理逻辑
修改Ag1类,让它能接收并处理来自GUI的文本消息:
import jade.core.Agent; import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate; public class Ag1 extends Agent{ @Override public void setup(){ // 添加循环行为,监听并处理来自GUI的消息 addBehaviour(new Comportamiento()); } @Override public void takeDown(){ System.out.println("Ag1 已停止"); } class Comportamiento extends CyclicBehaviour{ @Override public void action() { // 创建消息模板,只接收INFORM类型的消息(可按需调整) MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM); ACLMessage msg = myAgent.receive(mt); if(msg != null){ // 获取GUI传递的文本内容 String textFromGUI = msg.getContent(); System.out.println("Ag1 收到GUI的消息:" + textFromGUI); // 此处添加自定义业务处理逻辑,比如文本解析、任务执行等 processText(textFromGUI); } else { // 无消息时阻塞行为,避免空轮询浪费资源 block(); } } // 示例:文本处理方法 private void processText(String text){ System.out.println("正在处理文本:" + text); // 可扩展具体处理逻辑,如分词、计算、调用外部服务等 } } }
步骤2:修改Contenedor类,暴露AgentContainer引用
让GUI能获取AgentContainer实例,以便查找目标智能体:
import jade.core.Profile; import jade.core.ProfileImpl; import jade.core.Runtime; import jade.wrapper.AgentContainer; import jade.wrapper.StaleProxyException; import java.util.logging.Level; public class Contenedor { private AgentContainer contenedorAgentes; public void contenedor(){ Runtime runtime = Runtime.instance(); Profile profile = new ProfileImpl(null, 1097, null); contenedorAgentes = runtime.createMainContainer(profile); agregarAgentes(); } private void agregarAgentes(){ try { contenedorAgentes.createNewAgent("Ag1", Ag1.class.getName(), null).start(); } catch (StaleProxyException ex) { java.util.logging.Logger.getLogger(Contenedor.class.getName()).log(Level.SEVERE, null, ex); } } // 添加方法,返回AgentContainer实例 public AgentContainer getContenedorAgentes(){ return contenedorAgentes; } }
步骤3:修改GUI类,实现按钮点击发送消息给Ag1
在按钮点击事件中,创建ACL消息并发送给目标智能体:
import jade.lang.acl.ACLMessage; import jade.wrapper.AgentController; import jade.wrapper.StaleProxyException; public class GUI extends javax.swing.JFrame { Contenedor c; public GUI() { initComponents(); c = new Contenedor(); c.contenedor(); } // 自动生成的initComponents方法保持不变,此处省略 private void btnDesplegarActionPerformed(java.awt.event.ActionEvent evt) { String inputText = txtArea.getText(); if(inputText.trim().isEmpty()){ System.out.println("文本域不能为空"); return; } try { // 获取Ag1的AgentController AgentController ag1Controller = c.getContenedorAgentes().getAgent("Ag1"); // 创建ACL消息,设置消息类型为INFORM ACLMessage msg = new ACLMessage(ACLMessage.INFORM); // 添加目标智能体的AID msg.addReceiver(ag1Controller.getAID()); // 设置消息内容为文本域的输入内容 msg.setContent(inputText); // 通过AgentController异步发送消息 ag1Controller.putO2AObject(msg, AgentController.ASYNC); System.out.println("已向Ag1发送消息:" + inputText); // 可选:发送后清空文本域 txtArea.setText(""); } catch (StaleProxyException ex) { java.util.logging.Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, "无法发送消息给Ag1", ex); } } // main方法和变量声明保持不变,此处省略 }
关键说明
- ACL消息:JADE智能体通信的标准载体,支持多种消息类型(INFORM、REQUEST等),可根据业务场景选择适配类型。
- AgentController:通过AgentContainer获取目标智能体的控制器,是外部程序(如GUI)与智能体通信的桥梁。
- 行为阻塞:在Agent的CyclicBehaviour中,无消息时调用
block()方法,避免空轮询消耗CPU资源。
内容的提问来源于stack exchange,提问作者Daniel Velin
相关产品推荐
相关产品推荐

