java - 为什么使用 setText 后 Gtk TextBuffer onChanged 会被调用两次?
问题描述
我试图在每次 TextBuffer 的内容更改时调用一个函数,无论是通过使用buffer.setText("...")
还是在用户键入内容时,但是在使用 setText 之后,该函数被调用两次(而不是一次)。
package com.example;
import org.gnome.gtk.*;
public class Main {
public static void main(String[] args) {
Gtk.init(args);
Window w = new Window();
w.setDefaultSize(200, 200);
TextBuffer buffer = new TextBuffer();
buffer.setText("first text");
TextView textView = new TextView(buffer);
buffer.connect(new TextBuffer.Changed() {
@Override
public void onChanged(TextBuffer textBuffer) {
System.out.println("onChange called with " + textBuffer.getText());
}
});
buffer.setText("second text");
buffer.setText("third text");
w.add(textView);
w.connect((Window.DeleteEvent) (source, event) -> {
Gtk.mainQuit();
return false;
});
w.showAll();
Gtk.main();
}
}
此示例打印
onChange called with
onChange called with second text
onChange called with
onChange called with third text
知道为什么会这样吗?我正在使用 java-gnome 4.1 和 java 1.8。
解决方案
gtk_text_buffer_set_text
是gtk_text_buffer_delete
和的组合gtk_text_buffer_insert
。这个函数发出"delete-range"
和"insert-text"
信号。这些信号具有默认处理程序。这些处理程序发出"changed"
.
所以实际上对于单个gtk_buffer_set_text
呼叫信号按以下顺序发出:
"delete-range"
"changed"
"insert-text"
"changed"
推荐阅读
- json - JSON 自动添加反斜杠
- php - Livewire - 从组件强制更新视图
- acl - RunDeck 中 Adhoc 命令的访问控制
- flutter - 在颤动中显示登录表单的问题
- reactjs - 如何使我的导入仅对日历项目做出英文反应?
- c# - C# 导航 JSON 结构嵌套返回 NullReferenceException
- blazor - Blazor 应用程序不会将 css 隔离范围标识符添加到 razor 类库组件元素
- java - 我在名称属性中进行了验证,但它不起作用
- c++ - 在 C++ 中加载 DLL 文件
- java - 如何使 LiveData getValue() 函数返回我在 Android 中的房间数据库中的项目列表?