IDE插件开发四:开发AI助手对话窗口

Eclipse插件开发一:hello word
Eclipse插件开发二:初识hello word的配置信息
Eclipse插件开发三:快捷搜索
Eclipse插件开发四:开发对话窗口

之前我们介绍了一个快捷搜索的案例,后续我们将快捷搜索换成最近比较火的DeepSeek来试水,不过当前我们首要任务是开发一个对话窗口。后面我们在将AI助手的回答换成各种GPT的回答,这个功能就差不多实现了。
如下所示,这里就不要关心这个界面丑不丑的问题了,毕竟咱也不是专门设计,也不是写界面的。
在这里插入图片描述

plugin.xml

将下面的插件配置,添加到plugin.xml

	<extension
        point="org.eclipse.ui.views">
        <view
            id="com.hutao.search.ai.plugin.aiview"
            name="AI助手"
            class="com.hutao.search.view.AiView"
            category="com.example.myplugin.category">
        </view>
    </extension>

    <extension
        point="org.eclipse.ui.perspectiveExtensions">
        <perspectiveExtension
            targetID="org.eclipse.ui.resourcePerspective">
            <view
                id="com.hutao.search.ai.plugin.aiview"
                relationship="left"
                relative="org.eclipse.ui.navigator.ProjectExplorer">
            </view>
        </perspectiveExtension>
    </extension>

在这里插入图片描述

MANIFEST.MF

在MANIFEST.MF添加如下依赖
在这里插入图片描述

View界面

通过继承ViewPart 来实现我们自己的AI助手页面

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
public class AiView extends ViewPart {
	
	// 和 plugin.xml 中的 id 一致
	public static final String ID = "com.hutao.search.ai.plugin.aiview"; 
	
	// 聊天内容容器
	private Composite messageContainer; 
	
	// 用户输入框
	private Text userInput;             
	
	@Override
	public void createPartControl(Composite parent) {
		// 设置父容器的布局
		parent.setLayout(new GridLayout(1, false));
		
		// 滚动容器,用于容纳聊天内容
		ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
		scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		// 聊天内容容器
		messageContainer = new Composite(scrolledComposite, SWT.NONE);
		messageContainer.setLayout(new GridLayout(1, false));
		scrolledComposite.setContent(messageContainer);
		scrolledComposite.setMinSize(messageContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		// 用户输入区域
		Composite inputArea = new Composite(parent, SWT.NONE);
		inputArea.setLayout(new GridLayout(2, false));
		inputArea.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
		
		// 输入框 - 设置为多行
		userInput = new Text(inputArea, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
		GridData inputData = new GridData(SWT.FILL, SWT.FILL, true, true);
		inputData.heightHint = 60; // 设置输入框的高度
		userInput.setLayoutData(inputData);
		userInput.setMessage("输入消息..."); // 提示信息
		
		// 发送按钮
		Button sendButton = new Button(inputArea, SWT.PUSH);
		sendButton.setText("Send");
		sendButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
		
		// 按钮点击事件
		sendButton.addListener(SWT.Selection, e -> handleUserInput(scrolledComposite));
		
		// 添加键盘监听器
		userInput.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if (e.keyCode == SWT.CR) { // 检测回车键
					if ((e.stateMask & SWT.CTRL) != 0) {
						// Ctrl + 回车,插入换行
						userInput.append("\n");
					} else {
						// 只按回车,发送消息
						handleUserInput(scrolledComposite);
						e.doit = false; // 防止默认行为(换行)
					}
				}
			}
		});
	}
	
	/**
	 * 处理用户输入并生成系统回复
	 */
	private void handleUserInput(ScrolledComposite scrolledComposite) {
		String userMessage = userInput.getText().trim(); // 获取用户输入内容
		if (userMessage.isEmpty()) {
			return; // 如果输入为空,直接返回
		}
		
		// 显示用户消息(靠右)
		appendMessage(userMessage + " :You", SWT.RIGHT);
		
		// 根据用户输入生成系统回复
		String systemReply = userMessage.equalsIgnoreCase("ABC") ? "yes" : "no";
		
		// 显示系统回复(靠左)
		appendMessage("AI助手: " + systemReply, SWT.LEFT);
		
		// 清空输入框
		userInput.setText("");
		
		// 自动滚动到最新消息
		scrolledComposite.setMinSize(messageContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		scrolledComposite.layout();
		scrolledComposite.setOrigin(0, messageContainer.getSize().y);
	}
	
	/**
	 * 在聊天窗口中追加消息
	 * @param message 要追加的消息
	 * @param alignment 消息的对齐方式(SWT.LEFT 或 SWT.RIGHT)
	 */
	private void appendMessage(String message, int alignment) {
		// 单条消息容器
		Composite messageWrapper = new Composite(messageContainer, SWT.NONE);
		messageWrapper.setLayout(new GridLayout(1, false));
		GridData wrapperData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		wrapperData.horizontalAlignment = alignment == SWT.RIGHT ? SWT.END : SWT.BEGINNING;
		messageWrapper.setLayoutData(wrapperData);
		
		// 消息标签
		Label messageLabel = new Label(messageWrapper, SWT.WRAP);
		messageLabel.setText(message);
		messageLabel.setBackground(messageContainer.getDisplay().getSystemColor(SWT.COLOR_WHITE));
		messageLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
		
		// 调整布局
		messageContainer.layout();
	}
	
	@Override
	public void setFocus() {
		userInput.setFocus(); // 将焦点设置到用户输入框
	}
}

效果呈现

以此点击 Show View 》Other
在这里插入图片描述
即可在里面看到我们定义的AI助手。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值