用于大输出的Java高级文本日志窗格
Mathematica附带了一个简单的java程序,允许检查前端和内核之间的通信。它被称为,一般来说,它工作得很好。看起来像这样 我认为我可以在一定程度上改进程序的行为和可用性,但要做到这一点,我需要重新实现一些部分。我需要的一个基本部分是文本窗格,它具有以下属性:用于大输出的Java高级文本日志窗格,java,logging,textbox,wolfram-mathematica,Java,Logging,Textbox,Wolfram Mathematica,Mathematica附带了一个简单的java程序,允许检查前端和内核之间的通信。它被称为,一般来说,它工作得很好。看起来像这样 我认为我可以在一定程度上改进程序的行为和可用性,但要做到这一点,我需要重新实现一些部分。我需要的一个基本部分是文本窗格,它具有以下属性: 它可以接收大量数据,并且可能应该使用快速环形缓冲区,以便在数据增长过多时删除第一个日志行。另一种可能性是,它会自动开始将数据写入磁盘,并可能在用户向上滚动查看第一个条目时重新加载数据 它应该能够处理彩色文本。我计划在每一行上使用
- 它可以接收大量数据,并且可能应该使用快速环形缓冲区,以便在数据增长过多时删除第一个日志行。另一种可能性是,它会自动开始将数据写入磁盘,并可能在用户向上滚动查看第一个条目时重新加载数据
- 它应该能够处理彩色文本。我计划在每一行上使用一个简单的荧光笔(日志数据实际上是真正的Mathematica语法),以使阅读更容易
- 它不需要是可写的。如果文本窗格是只读的,则可以
JTextArea
,在我开始编写自己的版本之前,我想问问是否有人已经这样做了
编辑:
我计划做的是使用一些日志框架,因为在我看来,这些库应该能够处理大量数据是很自然的。此外,它们通常提供接口来格式化消息,您可以定义不同的处理程序来处理不同的消息。我所希望的是,有人已经将它与一个可以处理大量输出的整洁的文本窗口结合起来了。正如Simon所指出的,我建议使用JavaFX来完成这项任务 如果您“只是”需要显示大量日志数据,而不需要进行高级高亮显示(子字符串范围高亮显示),则此组件适用于您 它使用虚拟化的布局容器,因此只有视口可见区域中的单元才会实际渲染。这允许延迟加载、单元回收等。
ListView
使用作为其数据结构。与EMFEList
类似,ObservableList
会自动通知ListView
其包含数据的更改
有几种工厂方法通过允许包装现有的列表来创建ObservableList
(例如RingBuffer
)
如果您需要高级高亮显示,这可能是一个解决方案,因为它允许对其包含的文本进行详细的样式设置RichTextFX
也使用虚拟化布局
编辑#2 Tom在他的博客中写到:
编辑#1列表视图示例 JavaFX在将模型与视图分离方面做得非常好,因此我们尽量避免将其混淆,需要创建两件事:
单元
呈现程序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;
}
}
这不是一个完全有效的示例,还有几个任务要做,但希望您能理解
如果您想添加搜索高亮显示,我在这里为TableView控件元素描述了一种类似的方法:没有任何符合您需要的现有组件出现在脑海中,但是如果您必须自己制作,您是否看过JavaFX?它有很好的高级组件,包括Java8中的
TextFlow
。请看这篇博文和评论以获得预览@SimonBasléNo,我不知道JavaFX,但我会看看它。谢谢你的评论。谢谢你的回答,我会阅读你给出的链接。不喜欢你回答的人。你仍然有我的投票权,我简短地查看了ListView
的文档,这似乎是一个很好的起点。RichTextFX对我来说似乎有点太多了。我创建了一个测试,它使用了一个普通的列表视图
,带有一个自定义样式的可观察列表
。假设我想使用一个简单的可观察列表
来存储我的数据,并且只有当前在列表视图
中可见的少数单元格应该突出显示。我想我必须建立自己的细胞工厂。当我想要字符串的默认单元格工厂的所有属性时,只有我的工厂通过运行和使用lexer来显示彩色文本,你知道如何轻松实现吗?永远不要混合视图和模型,所以我在我的答案中添加了一个相当大的编辑。希望你能明白这个想法?:-)这就是我问的原因,因为我想要的正是这种数据和表示的分离。非常感谢。
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);
}
}
}
}