mstover1 2003/02/06 10:53:08
Modified: src/components/org/apache/jmeter/visualizers
GraphVisualizer.java
Log:
Updating Graph Results GUI (Jeremy Arnold)
Revision Changes Path
1.6 +275 -133
jakarta-jmeter/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java
Index: GraphVisualizer.java
===================================================================
RCS file:
/home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- GraphVisualizer.java 3 Feb 2003 14:29:00 -0000 1.5
+++ GraphVisualizer.java 6 Feb 2003 18:53:08 -0000 1.6
@@ -2,7 +2,7 @@
* ====================================================================
* The Apache Software License, Version 1.1
*
- * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * Copyright (c) 2001,2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,14 +57,16 @@
import java.awt.BorderLayout;
import java.awt.Color;
+import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
-import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
@@ -247,7 +249,7 @@
}
/****************************************
- * Description of the Method
+ * Initialize the GUI
***************************************/
private void init()
{
@@ -273,151 +275,291 @@
mainPanel.add(getNamePanel());
mainPanel.add(this.getFilePanel());
- // Set up panel where user can choose which graphs to display
- JPanel chooseGraphsPanel = new JPanel();
- chooseGraphsPanel.setLayout(new FlowLayout());
- JLabel selectGraphsLabel = new
JLabel(JMeterUtils.getResString("graph_choose_graphs"));
+ // Set up the graph with header, footer, Y axis and graph display
+ JPanel graphPanel = new JPanel(new BorderLayout());
+ graphPanel.add(createYAxis(), BorderLayout.WEST);
+ graphPanel.add(createChoosePanel(), BorderLayout.NORTH);
+ graphPanel.add(createGraphPanel(), BorderLayout.CENTER);
+ graphPanel.add(createGraphInfoPanel(), BorderLayout.SOUTH);
+
+ // Add the main panel and the graph
+ this.add(mainPanel, BorderLayout.NORTH);
+ this.add(graphPanel, BorderLayout.CENTER);
+ }
+
+ // Methods used in creating the GUI
+
+ /**
+ * Creates the panel containing the graph's Y axis labels.
+ *
+ * @return the Y axis panel
+ */
+ private JPanel createYAxis() {
+ JPanel graphYAxisPanel = new JPanel();
+
+ graphYAxisPanel.setLayout(new BorderLayout());
+
+ maxYField = createYAxisField(5);
+ minYField = createYAxisField(3);
+
+ graphYAxisPanel.add(createYAxisPanel("graph_results_ms", maxYField),
+ BorderLayout.NORTH);
+ graphYAxisPanel.add(createYAxisPanel("graph_results_ms", minYField),
+ BorderLayout.SOUTH);
+
+ return graphYAxisPanel;
+ }
+
+ /**
+ * Creates a text field to be used for the value of a Y axis
+ * label. These fields hold the minimum and maximum values
+ * for the graph. The units are kept in a separate label
+ * outside of this field.
+ *
+ * @param length the number of characters which the field
+ * will use to calculate its preferred width.
+ * This should be set to the maximum number
+ * of digits that are expected to be necessary
+ * to hold the label value.
+ *
+ * @see #createYAxisPanel(String, JTextField)
+ *
+ * @return a text field configured to be used in the Y axis
+ */
+ private JTextField createYAxisField(int length) {
+ JTextField field = new JTextField(length);
+ field.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
+ field.setEditable(false);
+ field.setForeground(Color.black);
+ field.setBackground(getBackground());
+ field.setHorizontalAlignment(JTextField.RIGHT);
+ return field;
+ }
+
+ /**
+ * Creates a panel for an entire Y axis label. This includes
+ * the dynamic value as well as the unit label.
+ *
+ * @param labelResourceName the name of the label resource.
+ * This is used to look up the label text using
+ * {@link JMeterUtils#getResString(String)}.
+ *
+ * @return a panel containing both the dynamic and static parts
+ * of a Y axis label
+ */
+ private JPanel createYAxisPanel(String labelResourceName, JTextField field) {
+ JPanel panel = new JPanel(new FlowLayout());
+ JLabel label = new JLabel(JMeterUtils.getResString(labelResourceName));
+
+ panel.add(field);
+ panel.add(label);
+ return panel;
+ }
+
- data = new JCheckBox(JMeterUtils.getResString("graph_results_data"));
- data.setSelected(true);
- data.addItemListener(this);
- data.setForeground(Color.black);
- average = new JCheckBox(JMeterUtils.getResString("graph_results_average"));
- average.setSelected(true);
- average.addItemListener(this);
- average.setForeground(Color.blue);
- deviation = new
JCheckBox(JMeterUtils.getResString("graph_results_deviation"));
- deviation.setSelected(true);
- deviation.addItemListener(this);
- deviation.setForeground(Color.red);
- throughput = new
JCheckBox(JMeterUtils.getResString("graph_results_throughput"));
- throughput.setSelected(true);
- throughput.addItemListener(this);
- throughput.setForeground(JMeterColor.dark_green);
+ /**
+ * Creates a panel which allows the user to choose which graphs
+ * to display. This panel consists of a check box for each type
+ * of graph (current sample, average, deviation, and throughput).
+ *
+ * @return a panel allowing the user to choose which graphs
+ * to display
+ */
+ private JPanel createChoosePanel() {
+ JPanel chooseGraphsPanel = new JPanel();
+
+ chooseGraphsPanel.setLayout(new FlowLayout());
+ JLabel selectGraphsLabel = new JLabel(
+ JMeterUtils.getResString("graph_choose_graphs"));
+ data = createChooseCheckBox("graph_results_data", Color.black);
+ average = createChooseCheckBox("graph_results_average", Color.blue);
+ deviation = createChooseCheckBox("graph_results_deviation", Color.red);
+ throughput = createChooseCheckBox("graph_results_throughput",
+ JMeterColor.dark_green);
chooseGraphsPanel.add(selectGraphsLabel);
chooseGraphsPanel.add(data);
chooseGraphsPanel.add(average);
chooseGraphsPanel.add(deviation);
chooseGraphsPanel.add(throughput);
+ return chooseGraphsPanel;
+ }
+
+ /**
+ * Creates a check box configured to be used to in the choose panel
+ * allowing the user to select whether or not a particular kind of
+ * graph data will be displayed.
+ *
+ * @param labelResourceName the name of the label resource.
+ * This is used to look up the label text using
+ * {@link JMeterUtils#getResString(String)}.
+ * @param color the color used for the checkbox text. By
+ * convention this is the same color that is used
+ * to draw the graph and for the corresponding
+ * info field.
+ *
+ * @return a checkbox allowing the user to select whether or
+ * not a kind of graph data will be displayed
+ */
+ private JCheckBox createChooseCheckBox(String labelResourceName, Color color) {
+ JCheckBox checkBox = new JCheckBox(
+ JMeterUtils.getResString(labelResourceName));
+ checkBox.setSelected(true);
+ checkBox.addItemListener(this);
+ checkBox.setForeground(color);
+ return checkBox;
+ }
- // Set up the graph itself
- JScrollPane graphScrollPanel = new JScrollPane(graph,
JScrollPane.VERTICAL_SCROLLBAR_NEVER,
- JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
- graphScrollPanel.setViewportBorder(BorderFactory.createEmptyBorder(2, 2, 2,
2));
- //
graphScrollPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
- //
graphScrollPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
+ /**
+ * Creates a scroll pane containing the actual graph of
+ * the results.
+ *
+ * @return a scroll pane containing the graph
+ */
+ private JScrollPane createGraphPanel() {
+ JScrollPane graphScrollPanel =
+ new JScrollPane(graph, JScrollPane.VERTICAL_SCROLLBAR_NEVER,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ graphScrollPanel.setViewportBorder(
+ BorderFactory.createEmptyBorder(2, 2, 2, 2));
- // Set up Y axis panel
- JPanel graphYAxisPanel = new JPanel();
+ return graphScrollPanel;
+ }
- graphYAxisPanel.setLayout(new BorderLayout());
- JPanel maxYPanel = new JPanel(new FlowLayout());
- JLabel maxYLabel = new JLabel(JMeterUtils.getResString("graph_results_ms"));
- maxYField = new JTextField(5);
- maxYField.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
- maxYField.setEditable(false);
- maxYField.setForeground(Color.black);
- maxYField.setBackground(getBackground());
- maxYField.setHorizontalAlignment(JTextField.RIGHT);
- maxYPanel.add(maxYField);
- maxYPanel.add(maxYLabel);
- JPanel minYPanel = new JPanel(new FlowLayout());
- JLabel minYLabel = new JLabel(JMeterUtils.getResString("graph_results_ms"));
-
- minYField = new JTextField(3);
- minYField.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
- minYField.setEditable(false);
- minYField.setForeground(Color.black);
- minYField.setBackground(getBackground());
- minYField.setHorizontalAlignment(JTextField.RIGHT);
- minYPanel.add(minYField);
- minYPanel.add(minYLabel);
- graphYAxisPanel.add(maxYPanel, BorderLayout.NORTH);
- graphYAxisPanel.add(minYPanel, BorderLayout.SOUTH);
-
- // Set up footer of graph which displays numerics of the graphs
- JPanel dataPanel = new JPanel();
- JLabel dataLabel = new
JLabel(JMeterUtils.getResString("graph_results_latest_sample"));
-
- dataLabel.setForeground(Color.black);
- dataField = new JTextField(5);
- dataField.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- dataField.setEditable(false);
- dataField.setForeground(Color.black);
- dataField.setBackground(getBackground());
- dataPanel.add(dataLabel);
- dataPanel.add(dataField);
- JPanel averagePanel = new JPanel();
- JLabel averageLabel = new
JLabel(JMeterUtils.getResString("graph_results_average"));
-
- averageLabel.setForeground(Color.blue);
- averageField = new JTextField(5);
- averageField.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- averageField.setEditable(false);
- averageField.setForeground(Color.blue);
- averageField.setBackground(getBackground());
- averagePanel.add(averageLabel);
- averagePanel.add(averageField);
- JPanel deviationPanel = new JPanel();
- JLabel deviationLabel = new
JLabel(JMeterUtils.getResString("graph_results_deviation"));
-
- deviationLabel.setForeground(Color.red);
- deviationField = new JTextField(5);
- deviationField.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- deviationField.setEditable(false);
- deviationField.setForeground(Color.red);
- deviationField.setBackground(getBackground());
- deviationPanel.add(deviationLabel);
- deviationPanel.add(deviationField);
- JPanel throughputPanel = new JPanel();
- JLabel throughputLabel = new
JLabel(JMeterUtils.getResString("graph_results_throughput"));
-
- throughputLabel.setForeground(JMeterColor.dark_green);
- throughputField = new JTextField(15);
- throughputField.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- throughputField.setEditable(false);
- throughputField.setForeground(JMeterColor.dark_green);
- throughputField.setBackground(getBackground());
- throughputPanel.add(throughputLabel);
- throughputPanel.add(throughputField);
- JPanel noSamplesPanel = new JPanel();
- JLabel noSamplesLabel = new
JLabel(JMeterUtils.getResString("graph_results_no_samples"));
-
- noSamplesField = new JTextField(6);
- noSamplesField.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
- noSamplesField.setEditable(false);
- noSamplesField.setForeground(Color.black);
- noSamplesField.setBackground(getBackground());
- noSamplesPanel.add(noSamplesLabel);
- noSamplesPanel.add(noSamplesField);
-
- JPanel graphInfoPanel = new JPanel();
-
- graphInfoPanel.setLayout(new GridLayout(2, 3));
- graphInfoPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
-
- graphInfoPanel.add(noSamplesPanel);
- graphInfoPanel.add(dataPanel);
- graphInfoPanel.add(averagePanel);
- graphInfoPanel.add(deviationPanel);
- graphInfoPanel.add(throughputPanel);
+ /**
+ * Creates a panel which numerically displays the current graph
+ * values.
+ *
+ * @return a panel showing the current graph values
+ */
+ private Box createGraphInfoPanel() {
+ Box graphInfoPanel = Box.createHorizontalBox();
+
+ noSamplesField = createInfoField(Color.black, 6);
+ dataField = createInfoField(Color.black, 5);
+ averageField = createInfoField(Color.blue, 5);
+ deviationField = createInfoField(Color.red, 5);
+ throughputField = createInfoField(JMeterColor.dark_green, 15);
+
+ graphInfoPanel.add(createInfoColumn(
+ createInfoLabel("graph_results_no_samples", noSamplesField),
+ noSamplesField,
+ createInfoLabel("graph_results_deviation", deviationField),
+ deviationField));
+ graphInfoPanel.add(Box.createHorizontalGlue());
+
+ graphInfoPanel.add(createInfoColumn(
+ createInfoLabel("graph_results_latest_sample", dataField),
+ dataField,
+ createInfoLabel("graph_results_throughput", throughputField),
+ throughputField));
+ graphInfoPanel.add(Box.createHorizontalGlue());
+
+ graphInfoPanel.add(createInfoColumn(
+ createInfoLabel("graph_results_average", averageField),
+ averageField,
+ null,
+ null));
+ graphInfoPanel.add(Box.createHorizontalGlue());
- // Set up the graph with header, footer, Y axis and graph display
- JPanel graphPanel = new JPanel();
+ return graphInfoPanel;
+ }
- graphPanel.setLayout(new BorderLayout());
- graphPanel.add(graphYAxisPanel, BorderLayout.WEST);
- graphPanel.add(chooseGraphsPanel, BorderLayout.NORTH);
- graphPanel.add(graphScrollPanel, BorderLayout.CENTER);
- graphPanel.add(graphInfoPanel, BorderLayout.SOUTH);
+ /**
+ * Creates one of the fields used to display the graph's current
+ * values.
+ *
+ * @param color the color used to draw the value. By convention
+ * this is the same color that is used to draw the
+ * graph for this value and in the choose panel.
+ * @param length the number of digits which the field should be
+ * able to display
+ *
+ * @return a text field configured to display one of the
+ * current graph values
+ */
+ private JTextField createInfoField(Color color, int length) {
+ JTextField field = new JTextField(length);
+ field.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ field.setEditable(false);
+ field.setForeground(color);
+ field.setBackground(getBackground());
+
+ // The text field should expand horizontally, but have
+ // a fixed height
+ field.setMaximumSize(new Dimension(
+ field.getMaximumSize().width,
+ field.getPreferredSize().height));
+ return field;
+ }
- // Add the main panel and the graph
- this.add(mainPanel, BorderLayout.NORTH);
- this.add(graphPanel, BorderLayout.CENTER);
+
+ /**
+ * Creates a label for one of the fields used to display the graph's
+ * current values. Neither the label created by this method or the
+ * <code>field</code> passed as a parameter is added to the GUI here.
+ *
+ * @param labelResourceName the name of the label resource.
+ * This is used to look up the label text using
+ * {@link JMeterUtils#getResString(String)}.
+ * @param field the field this label is being created for.
+ */
+ private JLabel createInfoLabel(String labelResourceName, JTextField field) {
+ JLabel label = new JLabel(
+ JMeterUtils.getResString(labelResourceName));
+ label.setForeground(field.getForeground());
+ label.setLabelFor(field);
+ return label;
+ }
+
+ /**
+ * Creates a panel containing two pairs of labels and fields for
+ * displaying the current graph values. This method exists to help with
+ * laying out the fields in columns. If one or more components are null
+ * then these components will be represented by blank space.
+ *
+ * @param label1 the label for the first field. This label will
+ * be placed in the upper left section of the panel.
+ * If this parameter is null, this section of the
+ * panel will be left blank.
+ * @param field1 the field corresponding to the first label. This
+ * field will be placed in the upper right section
+ * of the panel. If this parameter is null, this
+ * section of the panel will be left blank.
+ * @param label2 the label for the second field. This label will
+ * be placed in the lower left section of the panel.
+ * If this parameter is null, this section of the
+ * panel will be left blank.
+ * @param field2 the field corresponding to the second label. This
+ * field will be placed in the lower right section
+ * of the panel. If this parameter is null, this
+ * section of the panel will be left blank.
+ */
+ private Box createInfoColumn(JLabel label1, JTextField field1,
+ JLabel label2, JTextField field2) {
+
+ // This column actually consists of a row with two sub-columns
+ // The first column contains the labels, and the second
+ // column contains the fields.
+ Box row = Box.createHorizontalBox();
+ Box col = Box.createVerticalBox();
+ col.add(label1 != null ? label1 : Box.createVerticalGlue());
+ col.add(label2 != null ? label2 : Box.createVerticalGlue());
+ row.add(col);
+
+ row.add(Box.createHorizontalStrut(5));
+
+ col = Box.createVerticalBox();
+ col.add(field1 != null ? field1 : Box.createVerticalGlue());
+ col.add(field2 != null ? field2 : Box.createVerticalGlue());
+ row.add(col);
+
+ row.add(Box.createHorizontalStrut(5));
+
+ return row;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]