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助手。