首页 > 解决方案 > 为什么使用 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。

标签: javagtk

解决方案


gtk_text_buffer_set_textgtk_text_buffer_delete和的组合gtk_text_buffer_insert。这个函数发出"delete-range""insert-text"信号。这些信号具有默认处理程序。这些处理程序发出"changed".

所以实际上对于单个gtk_buffer_set_text呼叫信号按以下顺序发出:

  1. "delete-range"
  2. "changed"
  3. "insert-text"
  4. "changed"

推荐阅读