草庐IT

java - 用于大输出的 Java 高级文本记录 Pane

coder 2023-08-31 原文

Mathematica 带有一个简单的 java 程序,可以检查前端和内核之间的通信。它叫做LinkSnooper总的来说效果很好。看起来像这样

我认为我可以在一定程度上改进程序的行为和可用性,但为此,我需要重新实现某些部分。我需要的一个基本部分是文本 Pane ,它具有以下属性:

  • 它可以接收大量数据,它可能应该使用快速环形缓冲区,以便在数据增长过多时删除最开始的日志行。另一种可能性是它会自动开始将数据写入磁盘,并可能在用户向上滚动以查看第一个条目时重新加载数据
  • 它应该能够处理彩色文本。我计划在每个到达的行上使用一个简单的荧光笔(日志数据实际上是真正的 Mathematica 语法)以使阅读更容易
  • 它不需要是可写的。如果文本 Pane 是只读的,那也没关系。

问题:这样的东西是否已经存在?目前,LinkSnooper 在下面使用了一个 JTextArea,在我开始编写自己的版本之前,我想问问是否有人已经这样做了。

编辑:

我计划做的是使用一些 Logger 框架,因为对我来说这些库应该能够处理大量数据是很自然的。此外,它们通常提供接口(interface)来格式化消息,您可以定义不同的处理程序来处理不同的消息。我所希望的是有人已经将它与可以处理大量输出的整洁工作的文本窗口结合起来。

最佳答案

正如 Simon 所指出的,我建议使用 JavaFX 来完成这项任务。

如果您“只是”需要显示大量日志数据而无需高级突出显示(子字符串范围突出显示),ListView是适合您的组件。

它使用了一个虚拟化的布局容器,所以实际上只有在视口(viewport)可见区域的单元格才会被渲染。这允许延迟加载、单元格回收等。 ListView 使用 ObservableList作为它的数据结构。与 EMF EList 类似,ObservableList 会自动通知 ListView 其包含的数据发生变化。

有几种工厂方法可以通过FXCollections 创建一个ObservableList。甚至允许包装现有的 List(例如 RingBuffer)。

如果您需要高级突出显示,RichTextFX可能是要寻求的解决方案,因为它允许对其包含的文本进行详细的样式设置。 RichTextFX 也使用虚拟化布局。


编辑 #2

Tom 在他的博客中写过:http://tomsondev.bestsolution.at/2014/12/27/displaying-and-editing-large-styled-texts/


编辑 #1 ListView 示例

JavaFX 在将模型与 View 分离方面做得非常好,因此我们尽量不要将其混淆,并且需要创建两件事:

  1. 一个数据类(模型)
  2. 该数据类( View )的 Cell 渲染器。

首先是数据类:

public class LogData {

    private final String logMessage;
    private List<String> highlightedFragments = null;

    public LogData(String pLogMessage) {
        logMessage = pLogMessage;
    }

    public String getLogMessage() {
        return logMessage;
    }

    public List<String> getHighlightedFragments() {
        if (highlightedFragments == null) {
            doHighlight();
        }
        return highlightedFragments;
    }

    private void doHighlight() {
        List<String> highlightedParts = Collections.emptyList(); // TODO lexer
        highlightedFragments = highlightedParts;
    }
}

有趣的是,突出显示是按需完成的,而不是在初始化时完成的。或者换句话说:词法分析器仅在单元格渲染器请求数据时执行其工作。

现在 Cell 渲染器:

ListView<LogData> listView = new ListView<>();
listView.setCellFactory(cb -> new LogDataCell(){});

public class LogDataCell extends ListCell<LogData>
{
    @Override
    protected void updateItem(LogData item, boolean empty) {
        super.updateItem(item, empty);

        if(empty || item == null) {
            setText(null);
            setGraphic(null);
        }
        else {
            List<String> fragments = item.getHighlightedFragments();
            if(fragments == null || fragments.isEmpty()) {
                setText(item.getLogMessage());
                setGraphic(null);
            }
            else {
                TextFlow textFlow = null; //TODO
                setText(null);
                setGraphic(textFlow);
            }
        }
    }
}

这不是一个完整的示例,还有几个待办事项,但希望您能理解。

如果你想添加搜索突出显示,我在此处描述了 TableView 控件元素的类似方法:JavaFX Table with highlighted text (Labels) with poor performance

关于java - 用于大输出的 Java 高级文本记录 Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27414689/

有关java - 用于大输出的 Java 高级文本记录 Pane的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  6. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  7. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  8. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  9. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐