From fd175d2918d0234581e84c754639eb431e188673 Mon Sep 17 00:00:00 2001
From: KingRabbid <13966341+KingRabbid@users.noreply.github.com>
Date: Wed, 6 Mar 2024 14:51:25 +0200
Subject: [PATCH 1/4] Add autoscroll and preferred width
---
bin/jmeter.properties | 6 ++++++
.../jmeter/visualizers/ViewResultsFullVisualizer.java | 10 ++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/bin/jmeter.properties b/bin/jmeter.properties
index 24a6798e4c0..bacd9f14b3e 100644
--- a/bin/jmeter.properties
+++ b/bin/jmeter.properties
@@ -1217,6 +1217,12 @@ view.results.tree.renderers_order=.RenderAsText,.RenderAsRegexp,.RenderAsBoundar
# Set to 0 to store all results (might consume a lot of memory)
#view.results.tree.max_results=500
+# Set to true to auto-enable the checkbox for auto-scroll when samplers are received
+#view.results.tree.autoscroll=false
+
+# default min width of the tree view
+#view.results.tree.width=250
+
# Maximum size of Document that can be parsed by Tika engine; default=10 * 1024 * 1024 (10 MB)
# Set to 0 to disable the size check
#document.max_size=0
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
index 44216aa7115..63c29774106 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
@@ -117,6 +117,12 @@ public class ViewResultsFullVisualizer extends AbstractVisualizer
private static final String VIEWERS_ORDER =
JMeterUtils.getPropDefault("view.results.tree.renderers_order", ""); // $NON-NLS-1$ //$NON-NLS-2$
+ //default scroll checkbox status
+ private static final boolean SCROLL_CHECKBOX = JMeterUtils.getPropDefault("view.results.tree.autoscroll", false);
+
+ // default tree view width
+ private static final int VIEWERS_WIDTH = JMeterUtils.getPropDefault("view.results.tree.width", 250); // $NON-NLS-1$
+
private static final int REFRESH_PERIOD = JMeterUtils.getPropDefault("jmeter.gui.refresh_period", 500);
private static final ImageIcon imageSuccess = JMeterUtils.getImage(
@@ -431,13 +437,13 @@ private synchronized Component createLeftPanel() {
jTree.setRootVisible(false);
jTree.setShowsRootHandles(true);
JScrollPane treePane = new JScrollPane(jTree);
- treePane.setPreferredSize(new Dimension(200, 300));
+ treePane.setPreferredSize(new Dimension(VIEWERS_WIDTH, 300));
VerticalPanel leftPane = new VerticalPanel();
leftPane.add(treePane, BorderLayout.CENTER);
leftPane.add(createComboRender(), BorderLayout.NORTH);
autoScrollCB = new JCheckBox(JMeterUtils.getResString("view_results_autoscroll")); // $NON-NLS-1$
- autoScrollCB.setSelected(false);
+ autoScrollCB.setSelected(SCROLL_CHECKBOX);
autoScrollCB.addItemListener(this);
leftPane.add(autoScrollCB, BorderLayout.SOUTH);
return leftPane;
From 955d7e2a06e153102695a095f8d3d5244a224373 Mon Sep 17 00:00:00 2001
From: KingRabbid <13966341+KingRabbid@users.noreply.github.com>
Date: Wed, 6 Mar 2024 15:19:27 +0200
Subject: [PATCH 2/4] Document the new configurable parameters
---
bin/jmeter.properties | 4 ++--
.../jmeter/visualizers/ViewResultsFullVisualizer.java | 6 +++---
xdocs/usermanual/properties_reference.xml | 8 ++++++++
3 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/bin/jmeter.properties b/bin/jmeter.properties
index bacd9f14b3e..c3c845c6e63 100644
--- a/bin/jmeter.properties
+++ b/bin/jmeter.properties
@@ -1217,10 +1217,10 @@ view.results.tree.renderers_order=.RenderAsText,.RenderAsRegexp,.RenderAsBoundar
# Set to 0 to store all results (might consume a lot of memory)
#view.results.tree.max_results=500
-# Set to true to auto-enable the checkbox for auto-scroll when samplers are received
+# Set to true to enable by default the checkbox for 'Scroll automatically?'.
#view.results.tree.autoscroll=false
-# default min width of the tree view
+# Default width of the scroll view
#view.results.tree.width=250
# Maximum size of Document that can be parsed by Tika engine; default=10 * 1024 * 1024 (10 MB)
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
index 63c29774106..9db807e818b 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
@@ -120,8 +120,8 @@ public class ViewResultsFullVisualizer extends AbstractVisualizer
//default scroll checkbox status
private static final boolean SCROLL_CHECKBOX = JMeterUtils.getPropDefault("view.results.tree.autoscroll", false);
- // default tree view width
- private static final int VIEWERS_WIDTH = JMeterUtils.getPropDefault("view.results.tree.width", 250); // $NON-NLS-1$
+ // default tree scroll width
+ private static final int SCROLL_WIDTH = JMeterUtils.getPropDefault("view.results.tree.width", 250); // $NON-NLS-1$
private static final int REFRESH_PERIOD = JMeterUtils.getPropDefault("jmeter.gui.refresh_period", 500);
@@ -437,7 +437,7 @@ private synchronized Component createLeftPanel() {
jTree.setRootVisible(false);
jTree.setShowsRootHandles(true);
JScrollPane treePane = new JScrollPane(jTree);
- treePane.setPreferredSize(new Dimension(VIEWERS_WIDTH, 300));
+ treePane.setPreferredSize(new Dimension(SCROLL_WIDTH, 300));
VerticalPanel leftPane = new VerticalPanel();
leftPane.add(treePane, BorderLayout.CENTER);
diff --git a/xdocs/usermanual/properties_reference.xml b/xdocs/usermanual/properties_reference.xml
index cb9cd3ba2cd..15ad86727ea 100644
--- a/xdocs/usermanual/properties_reference.xml
+++ b/xdocs/usermanual/properties_reference.xml
@@ -1556,6 +1556,14 @@ JMETER-SERVER
Can be switched off by setting the value to -1.
Defaults to: 10000
+
+ Set to true to enable by default the checkbox for 'Scroll automatically?'.
+ Defaults to: false
+
+
+ Default width of the scroll view.
+ Defaults to: 250
+
Maximum size (in bytes) of Document that can be parsed by Tika engine
Set to zero to disable the size check.
From 7dbd64c50925d46b2faa6a3cf78d881e4d666c7c Mon Sep 17 00:00:00 2001
From: KingRabbid <13966341+KingRabbid@users.noreply.github.com>
Date: Fri, 22 Mar 2024 10:01:50 +0200
Subject: [PATCH 3/4] Add Sampler name in Sampler Result tab
---
.../org/apache/jmeter/visualizers/SamplerResultTab.java | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java b/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java
index 7356f172295..da022ec157e 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java
@@ -263,6 +263,10 @@ public void setupTabPane() {
.append(JMeterUtils
.getResString("view_results_thread_name")) //$NON-NLS-1$
.append(sampleResult.getThreadName()).append(NL);
+ statsBuff
+ .append(JMeterUtils
+ .getResString("view_results_sample_name")) //$NON-NLS-1$
+ .append(sampleResult.getSampleLabel()).append(NL);
String startTime = dateFormat
.format(Instant.ofEpochMilli(sampleResult.getStartTime()));
statsBuff
@@ -369,6 +373,10 @@ public void setupTabPane() {
resultModel.addRow(new RowResult(
JMeterUtils.getParsedLabel("view_results_thread_name"), //$NON-NLS-1$
sampleResult.getThreadName()));
+ resultModel.addRow(new RowResult(
+ JMeterUtils.getParsedLabel(
+ "view_results_sample_name"), //$NON-NLS-1$
+ sampleResult.getSampleLabel()));
resultModel.addRow(new RowResult(
JMeterUtils.getParsedLabel("view_results_sample_start"), //$NON-NLS-1$
startTime));
From 4ef8218b3d632b5c32162066400f7732c0be90b0 Mon Sep 17 00:00:00 2001
From: KingRabbid <13966341+KingRabbid@users.noreply.github.com>
Date: Thu, 9 Oct 2025 03:18:14 +0300
Subject: [PATCH 4/4] Add milliseconds and GMT/UTC timezone in sampler
timestamp label; add checkbox to stop autoscroll on error; add button to
focus listing on selected node.
---
bin/jmeter.properties | 5 +-
.../jmeter/visualizers/SamplerResultTab.java | 2 +-
.../ViewResultsFullVisualizer.java | 117 ++++++++++++++++--
.../visualizers/gui/AbstractVisualizer.java | 8 +-
.../jmeter/resources/messages.properties | 5 +-
xdocs/usermanual/properties_reference.xml | 6 +-
6 files changed, 124 insertions(+), 19 deletions(-)
diff --git a/bin/jmeter.properties b/bin/jmeter.properties
index ce1c152e25b..0a1e8a5be1e 100644
--- a/bin/jmeter.properties
+++ b/bin/jmeter.properties
@@ -1217,9 +1217,12 @@ view.results.tree.renderers_order=.RenderAsText,.RenderAsRegexp,.RenderAsBoundar
# Set to 0 to store all results (might consume a lot of memory)
#view.results.tree.max_results=500
-# Set to true to enable by default the checkbox for 'Scroll automatically?'.
+# Set to true to enable by default the checkbox for auto scrolling.
#view.results.tree.autoscroll=false
+# Set to true to enable by default the checkbox for stop auto scrolling on 1st error.
+#view.results.tree.autostop=true
+
# Default width of the scroll view
#view.results.tree.width=250
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java b/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java
index 48837e42e3e..a83706812b6 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java
@@ -87,7 +87,7 @@ public abstract class SamplerResultTab implements ResultRenderer {
private static final Logger LOGGER = LoggerFactory.getLogger(SamplerResultTab.class);
// N.B. these are not multi-threaded, so don't make it static
private final DateTimeFormatter dateFormat = DateTimeFormatter
- .ofPattern("yyyy-MM-dd HH:mm:ss z") // ISO format $NON-NLS-1$
+ .ofPattern("yyyy-MM-dd HH:mm:ss.SSS O") // ISO format $NON-NLS-1$
.withZone(ZoneId.systemDefault());
private static final String NL = "\n"; // $NON-NLS-1$
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
index 674ba436864..b3c97201893 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
@@ -21,6 +21,8 @@
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
@@ -43,8 +45,10 @@
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
+import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
+import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
@@ -120,6 +124,9 @@ public class ViewResultsFullVisualizer extends AbstractVisualizer
//default scroll checkbox status
private static final boolean SCROLL_CHECKBOX = JMeterUtils.getPropDefault("view.results.tree.autoscroll", false);
+ //default uncheck if failed scroll checkbox status
+ private static final boolean SCROLL_STOP_CHECKBOX = JMeterUtils.getPropDefault("view.results.tree.autostop", true);
+
// default tree scroll width
private static final int SCROLL_WIDTH = JMeterUtils.getPropDefault("view.results.tree.width", 250); // $NON-NLS-1$
@@ -144,9 +151,10 @@ public class ViewResultsFullVisualizer extends AbstractVisualizer
private ResultRenderer resultsRender = null;
private Object resultsObject = null;
private TreeSelectionEvent lastSelectionEvent;
- private JCheckBox autoScrollCB;
+ private JCheckBox autoScrollCB, scrollStopCB;
private final Queue buffer;
private boolean dataChanged;
+ private SampleResult failedSampler;
/**
* Constructor
@@ -169,6 +177,8 @@ public void add(final SampleResult sample) {
synchronized (buffer) {
buffer.add(sample);
dataChanged = true;
+ if (!sample.isSuccessful() && failedSampler == null)
+ failedSampler = sample;
}
}
@@ -176,6 +186,7 @@ public void add(final SampleResult sample) {
* Update the visualizer with new data.
*/
private void updateGui() {
+ int failedSamplerPosition = 0;
TreePath selectedPath = null;
Object oldSelectedElement;
Set
- Set to true to enable by default the checkbox for 'Scroll automatically?'.
+ Set to true to enable by default the checkbox for auto scrolling.
Defaults to: false
+
+ Set to true to enable by default the checkbox for stop auto scrolling on 1st error.
+ Defaults to: true
+
Default width of the scroll view.
Defaults to: 250