Index: src/core/org/apache/jmeter/resources/messages_fr.properties =================================================================== --- src/core/org/apache/jmeter/resources/messages_fr.properties (revision 1311123) +++ src/core/org/apache/jmeter/resources/messages_fr.properties (working copy) @@ -25,17 +25,16 @@ add_value=Ajouter valeur addtest=Ajout aggregate_graph=Graphique des statistiques -aggregate_graph_choose_bar_color=Couleur barre aggregate_graph_choose_color=Choisir couleur aggregate_graph_choose_foreground_color=Couleur valeur aggregate_graph_color_bar=Couleur \: aggregate_graph_column=Colonne aggregate_graph_column_selection=S\u00E9lection de colonnes par libell\u00E9 \: aggregate_graph_column_settings=Param\u00E8tres colonne -aggregate_graph_current_colors=Couleurs courantes +aggregate_graph_columns_to_display=Colonnes \u00E0 afficher \: aggregate_graph_dimension=Taille graphique aggregate_graph_display=G\u00E9n\u00E9rer le graphique -aggregate_graph_draw_outlines=Bordures barre ? +aggregate_graph_draw_outlines=Bordure de barre ? aggregate_graph_dynamic_size=Taille de graphique dynamique aggregate_graph_font=Police \: aggregate_graph_height=Hauteur \: @@ -47,6 +46,7 @@ aggregate_graph_legend_placement=Position \: aggregate_graph_max_length_xaxis_label=Longueur maximum du libell\u00E9 de l'axe des abscisses \: aggregate_graph_ms=Millisecondes +aggregate_graph_no_values_to_graph=Pas de valeurs pour le graphique aggregate_graph_number_grouping=S\u00E9parateur de milliers ? aggregate_graph_reload_data=Recharger les donn\u00E9es aggregate_graph_response_time=Temps de r\u00E9ponse @@ -62,6 +62,8 @@ aggregate_graph_title_group=Titre aggregate_graph_use_group_name=Ajouter le nom du groupe aux libell\u00E9s aggregate_graph_user_title=Titre du graphique \: +aggregate_graph_value_font=Police de la valeur \: +aggregate_graph_value_labels_vertical=Libell\u00E9 de valeurs vertical ? aggregate_graph_width=Largeur \: aggregate_graph_xaxis_group=Abscisses aggregate_graph_yaxis_group=Ordonn\u00E9es @@ -159,7 +161,7 @@ comparison_regex_string=Expression r\u00E9guli\u00E8re comparison_regex_substitution=Substitution comparison_response_time=Temps de r\u00E9ponse \: -comparison_unit= ms +comparison_unit=ms comparison_visualizer_title=R\u00E9cepteur d'assertions de comparaison config_element=El\u00E9ment de configuration config_save_settings=Configurer Index: src/core/org/apache/jmeter/resources/messages.properties =================================================================== --- src/core/org/apache/jmeter/resources/messages.properties (revision 1311123) +++ src/core/org/apache/jmeter/resources/messages.properties (working copy) @@ -31,31 +31,31 @@ add_value=Add Value addtest=Add test aggregate_graph=Statistical Graphs -aggregate_graph_choose_bar_color=Bar color aggregate_graph_choose_color=Choose color aggregate_graph_choose_foreground_color=Foreground color aggregate_graph_color_bar=Color\: aggregate_graph_column=Column\: aggregate_graph_column_selection=Column label selection\: aggregate_graph_column_settings=Column settings -aggregate_graph_current_colors=Current colors +aggregate_graph_columns_to_display=Columns to display\: aggregate_graph_dimension=Graph size +aggregate_graph_display=Display Graph aggregate_graph_draw_outlines=Draw outlines bar? aggregate_graph_dynamic_size=Dynamic graph size -aggregate_graph_display=Display Graph aggregate_graph_font=Font\: aggregate_graph_height=Height\: aggregate_graph_legend=Legend -aggregate_graph_legend_placement=Placement\: aggregate_graph_legend.placement.bottom=Bottom -aggregate_graph_legend.placement.right=Right aggregate_graph_legend.placement.left=Left +aggregate_graph_legend.placement.right=Right aggregate_graph_legend.placement.top=Top +aggregate_graph_legend_placement=Placement\: aggregate_graph_max_length_xaxis_label=Max length of x-axis label\: aggregate_graph_ms=Milliseconds +aggregate_graph_no_values_to_graph=No values to graph aggregate_graph_number_grouping=Show number grouping? -aggregate_graph_response_time=Response Time aggregate_graph_reload_data=Reload data +aggregate_graph_response_time=Response Time aggregate_graph_save=Save Graph aggregate_graph_save_table=Save Table Data aggregate_graph_save_table_header=Save Table Header @@ -68,6 +68,8 @@ aggregate_graph_title_group=Title aggregate_graph_use_group_name=Include group name in label? aggregate_graph_user_title=Graph title\: +aggregate_graph_value_font=Value font\: +aggregate_graph_value_labels_vertical=Value labels vertical? aggregate_graph_width=Width\: aggregate_graph_xaxis_group=X Axis aggregate_graph_yaxis_group=Y Axis Index: src/components/org/apache/jmeter/visualizers/AxisGraph.java =================================================================== --- src/components/org/apache/jmeter/visualizers/AxisGraph.java (revision 1311123) +++ src/components/org/apache/jmeter/visualizers/AxisGraph.java (working copy) @@ -38,8 +38,8 @@ import org.jCharts.chartData.ChartDataException; import org.jCharts.chartData.DataSeries; import org.jCharts.properties.AxisProperties; -import org.jCharts.properties.BarChartProperties; import org.jCharts.properties.ChartProperties; +import org.jCharts.properties.ClusteredBarChartProperties; import org.jCharts.properties.DataAxisProperties; import org.jCharts.properties.LabelAxisProperties; import org.jCharts.properties.LegendProperties; @@ -67,19 +67,25 @@ protected String[] xAxisLabels; protected int width, height; + protected String[] legendLabels = { JMeterUtils.getResString("aggregate_graph_legend") }; + protected int maxYAxisScale; protected Font titleFont; protected Font legendFont; - protected Color color; + protected Font valueFont = new Font("SansSerif", Font.PLAIN, 8); + + protected Color[] color = { Color.YELLOW }; - protected Color foreColor; + protected Color foreColor = Color.BLACK; protected boolean outlinesBarFlag = false; protected boolean showGrouping = true; + + protected boolean valueOrientation = true; protected int legendPlacement = LegendProperties.BOTTOM; @@ -133,6 +139,10 @@ this.yAxisLabel = label; } + public void setLegendLabels(String[] labels) { + this.legendLabels = labels; + } + public void setWidth(int w) { this.width = w; } @@ -158,14 +168,14 @@ /** * @return the color */ - public Color getColor() { + public Color[] getColor() { return color; } /** * @param color the color to set */ - public void setColor(Color color) { + public void setColor(Color[] color) { this.color = color; } @@ -212,6 +222,20 @@ } /** + * @return the valueFont + */ + public Font getValueFont() { + return valueFont; + } + + /** + * @param valueFont the valueFont to set + */ + public void setValueFont(Font valueFont) { + this.valueFont = valueFont; + } + + /** * @return the legendPlacement */ public int getLegendPlacement() { @@ -240,6 +264,20 @@ } /** + * @return the valueOrientation + */ + public boolean isValueOrientation() { + return valueOrientation; + } + + /** + * @param valueOrientation the valueOrientation to set + */ + public void setValueOrientation(boolean valueOrientation) { + this.valueOrientation = valueOrientation; + } + + /** * @return the showGrouping */ public boolean isShowGrouping() { @@ -258,8 +296,10 @@ if (data != null && this.title != null && this.xAxisLabels != null && this.xAxisTitle != null && this.yAxisLabel != null && this.yAxisTitle != null) { - drawSample(this.title,this.maxLength,this.xAxisLabels,this.xAxisTitle, - this.yAxisTitle,this.data,this.width,this.height,this.color,this.legendFont,graphics); + drawSample(this.title, this.maxLength, this.xAxisLabels, + this.xAxisTitle, this.yAxisTitle, this.legendLabels, + this.data, this.width, this.height, this.color, + this.legendFont, graphics); } } @@ -285,7 +325,7 @@ } private void drawSample(String _title, int _maxLength, String[] _xAxisLabels, String _xAxisTitle, - String _yAxisTitle, double[][] _data, int _width, int _height, Color color, Font font, Graphics g) { + String _yAxisTitle, String[] _legendLabels, double[][] _data, int _width, int _height, Color[] _color, Font font, Graphics g) { double max = maxYAxisScale > 0 ? maxYAxisScale : findMax(_data); // define max scale y axis try { /** These controls are already done in StatGraphVisualizer @@ -309,25 +349,26 @@ _xAxisLabels[i]=squeeze(label, _maxLength); } this.setPreferredSize(new Dimension(_width,_height)); - DataSeries dataSeries = new DataSeries( _xAxisLabels, _xAxisTitle, _yAxisTitle, _title ); + DataSeries dataSeries = new DataSeries( _xAxisLabels, null, _yAxisTitle, _title ); // replace _xAxisTitle to null (don't display x axis title) - String[] legendLabels= { yAxisLabel }; - - BarChartProperties barChartProperties= new BarChartProperties(); - barChartProperties.setShowOutlinesFlag(outlinesBarFlag); + ClusteredBarChartProperties clusteredBarChartProperties= new ClusteredBarChartProperties(); + clusteredBarChartProperties.setShowOutlinesFlag(outlinesBarFlag); ValueLabelRenderer valueLabelRenderer = new ValueLabelRenderer(false, false, showGrouping, 0); valueLabelRenderer.setValueLabelPosition(ValueLabelPosition.AT_TOP); - valueLabelRenderer.useVerticalLabels(true); - if (legendFont != null) { - valueLabelRenderer.setValueChartFont(new ChartFont(legendFont, new Color(foreColor.getRGB()))); + + valueLabelRenderer.setValueChartFont(new ChartFont(valueFont, foreColor)); + valueLabelRenderer.useVerticalLabels(valueOrientation); + + clusteredBarChartProperties.addPostRenderEventListener(valueLabelRenderer); + + Paint[] paints = new Paint[_color.length]; + for (int i = 0; i < _color.length; i++) { + paints[i] = _color[i]; } - barChartProperties.addPostRenderEventListener(valueLabelRenderer); - - Paint[] paints = new Paint[] { color }; AxisChartDataSet axisChartDataSet = new AxisChartDataSet( - _data, legendLabels, paints, ChartType.BAR, barChartProperties ); + _data, _legendLabels, paints, ChartType.BAR_CLUSTERED, clusteredBarChartProperties ); dataSeries.addIAxisPlotDataSet( axisChartDataSet ); ChartProperties chartProperties= new ChartProperties(); Index: docs/images/screenshots/aggregate_graph_settings.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = image/png Index: docs/images/screenshots/aggregate_graph.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java =================================================================== --- src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java (revision 1311123) +++ src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java (working copy) @@ -46,6 +46,7 @@ import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; @@ -110,6 +111,8 @@ JMeterUtils.getResString("aggregate_report_total_label"); //$NON-NLS-1$ private final Border MARGIN = new EmptyBorder(0, 5, 0, 5); + + private Font FONT_SMALL = new Font("SansSerif", Font.PLAIN, 10); private JTable myJTable; @@ -144,9 +147,6 @@ private JButton saveTable = new JButton(JMeterUtils.getResString("aggregate_graph_save_table")); //$NON-NLS-1$ - private JButton chooseBarColor = - new JButton(JMeterUtils.getResString("aggregate_graph_choose_bar_color")); //$NON-NLS-1$ - private JButton chooseForeColor = new JButton(JMeterUtils.getResString("aggregate_graph_choose_foreground_color")); //$NON-NLS-1$ @@ -185,10 +185,10 @@ private int defaultHeight = 300; - private JLabel currentColor = new JLabel(JMeterUtils.getResString("aggregate_graph_current_colors")); //$NON-NLS-1$ - private JComboBox columnsList = new JComboBox(GRAPH_COLUMNS); + private List eltList = new ArrayList(); + private JCheckBox columnSelection = new JCheckBox(JMeterUtils.getResString("aggregate_graph_column_selection"), false); //$NON-NLS-1$ private JTextField columnMatchLabel = new JTextField(); @@ -205,6 +205,12 @@ private JComboBox titleFontStyleList = new JComboBox(StatGraphProperties.getFontStyleMap().keySet().toArray()); + private JComboBox valueFontNameList = new JComboBox(StatGraphProperties.getFontNameMap().keySet().toArray()); + + private JComboBox valueFontSizeList = new JComboBox(StatGraphProperties.fontSize); + + private JComboBox valueFontStyleList = new JComboBox(StatGraphProperties.getFontStyleMap().keySet().toArray()); + private JComboBox fontNameList = new JComboBox(StatGraphProperties.getFontNameMap().keySet().toArray()); private JComboBox fontSizeList = new JComboBox(StatGraphProperties.fontSize); @@ -216,10 +222,14 @@ private JCheckBox drawOutlinesBar = new JCheckBox(JMeterUtils.getResString("aggregate_graph_draw_outlines"), true); // Default checked // $NON-NLS-1$ private JCheckBox numberShowGrouping = new JCheckBox(JMeterUtils.getResString("aggregate_graph_number_grouping"), true); // Default checked // $NON-NLS-1$ + + private JCheckBox valueLabelsVertical = new JCheckBox(JMeterUtils.getResString("aggregate_graph_value_labels_vertical"), true); // Default checked // $NON-NLS-1$ private Color colorBarGraph = Color.YELLOW; private Color colorForeGraph = Color.BLACK; + + private int nbColToGraph = 1; public StatGraphVisualizer() { super(); @@ -240,6 +250,11 @@ new Functor[] { null, null, null, null, null, null, null, null, null, null }, new Class[] { String.class, Long.class, Long.class, Long.class, Long.class, Long.class, Long.class, String.class, String.class, String.class }); + eltList.add(new BarGraph("average", true, new Color(202, 0, 0))); + eltList.add(new BarGraph("aggregate_report_median", false, new Color(49, 49, 181))); + eltList.add(new BarGraph("aggregate_report_90%_line", false, new Color(42, 121, 42))); + eltList.add(new BarGraph("aggregate_report_min", false, Color.LIGHT_GRAY)); + eltList.add(new BarGraph("aggregate_report_max", false, Color.DARK_GRAY)); clearData(); init(); } @@ -357,18 +372,23 @@ } public void makeGraph() { + nbColToGraph = getNbColumns(); Dimension size = graphPanel.getSize(); - String wstr = graphWidth.getText(); - String hstr = graphHeight.getText(); String lstr = maxLengthXAxisLabel.getText(); + // canvas size int width = (int) size.getWidth(); - if (wstr.length() != 0) { - width = Integer.parseInt(wstr); - } int height = (int) size.getHeight(); - if (hstr.length() != 0) { - height = Integer.parseInt(hstr); + if (!dynamicGraphSize.isSelected()) { + String wstr = graphWidth.getText(); + String hstr = graphHeight.getText(); + if (wstr.length() != 0) { + width = Integer.parseInt(wstr); + } + if (hstr.length() != 0) { + height = Integer.parseInt(hstr); + } } + if (lstr.length() == 0) { lstr = "20";//$NON-NLS-1$ } @@ -384,10 +404,12 @@ graphPanel.setXAxisTitle((String) columnsList.getSelectedItem()); graphPanel.setYAxisLabels(this.yAxisLabel); graphPanel.setYAxisTitle(this.yAxisTitle); - graphPanel.setColor(colorBarGraph); + graphPanel.setLegendLabels(getLegendLabels()); + graphPanel.setColor(getBackColors()); graphPanel.setForeColor(colorForeGraph); graphPanel.setOutlinesBarFlag(drawOutlinesBar.isSelected()); graphPanel.setShowGrouping(numberShowGrouping.isSelected()); + graphPanel.setValueOrientation(valueLabelsVertical.isSelected()); graphPanel.setLegendPlacement(StatGraphProperties.getPlacementNameMap() .get(legendPlacementList.getSelectedItem()).intValue()); @@ -397,6 +419,9 @@ graphPanel.setLegendFont(new Font(StatGraphProperties.getFontNameMap().get(fontNameList.getSelectedItem()), StatGraphProperties.getFontStyleMap().get(fontStyleList.getSelectedItem()).intValue(), Integer.parseInt((String) fontSizeList.getSelectedItem()))); + graphPanel.setValueFont(new Font(StatGraphProperties.getFontNameMap().get(valueFontNameList.getSelectedItem()), + StatGraphProperties.getFontStyleMap().get(valueFontStyleList.getSelectedItem()).intValue(), + Integer.parseInt((String) valueFontSizeList.getSelectedItem()))); graphPanel.setHeight(height); graphPanel.setWidth(width); @@ -406,14 +431,24 @@ public double[][] getData() { if (model.getRowCount() > 1) { int count = model.getRowCount() -1; - int col = model.findColumn((String) columnsList.getSelectedItem()); - double[][] data = new double[1][count]; - for (int idx=0; idx < count; idx++) { - data[0][idx] = ((Number)model.getValueAt(idx,col)).doubleValue(); + + int size = nbColToGraph; + double[][] data = new double[size][count]; + int s = 0; + int cpt = 0; + for (BarGraph bar : eltList) { + if (bar.getChkBox().isSelected()) { + int col = model.findColumn((String) columnsList.getItemAt(cpt)); + for (int idx=0; idx < count; idx++) { + data[s][idx] = ((Number)model.getValueAt(idx,col)).doubleValue(); + } + s++; + } + cpt++; } return data; } - return new double[][]{ { 250, 45, 36, 66, 145, 80, 55 } }; + return null; } public String[] getAxisLabels() { @@ -425,9 +460,43 @@ } return labels; } - return new String[]{ "/", "/samples", "/jsp-samples", "/manager", "/manager/status", "/hello", "/world" }; + return null; + } + + private String[] getLegendLabels() { + String[] legends = new String[nbColToGraph]; + int i = 0; + for (BarGraph bar : eltList) { + if (bar.getChkBox().isSelected()) { + legends[i] = bar.getLabel(); + i++; + } + } + return legends; + } + + private Color[] getBackColors() { + Color[] backColors = new Color[nbColToGraph]; + int i = 0; + for (BarGraph bar : eltList) { + if (bar.getChkBox().isSelected()) { + backColors[i] = bar.getBackColor(); + i++; + } + } + return backColors; } + private int getNbColumns() { + int i = 0; + for (BarGraph bar : eltList) { + if (bar.getChkBox().isSelected()) { + i++; + } + } + return i; + } + /** * We use this method to get the data, since we are using * ObjectTableModel, so the calling getDataVector doesn't @@ -453,8 +522,15 @@ public void actionPerformed(ActionEvent event) { final Object eventSource = event.getSource(); if (eventSource == displayButton) { - makeGraph(); - tabbedGraph.setSelectedIndex(1); + if (model.getRowCount() > 1) { + makeGraph(); + tabbedGraph.setSelectedIndex(1); + } else { + JOptionPane.showMessageDialog(null, JMeterUtils + .getResString("aggregate_graph_no_values_to_graph"), // $NON-NLS-1$ + JMeterUtils.getResString("aggregate_graph_no_values_to_graph"), // $NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + } } else if (eventSource == saveGraph) { saveGraphToFile = true; try { @@ -480,18 +556,14 @@ } finally { JOrphanUtils.closeQuietly(writer); } - } else if (eventSource == chooseBarColor) { - colorBarGraph = JColorChooser.showDialog( - null, - JMeterUtils.getResString("aggregate_graph_choose_color"), //$NON-NLS-1$ - colorBarGraph); - currentColor.setBackground(colorBarGraph); } else if (eventSource == chooseForeColor) { - colorForeGraph = JColorChooser.showDialog( + Color color = JColorChooser.showDialog( null, JMeterUtils.getResString("aggregate_graph_choose_color"), //$NON-NLS-1$ colorBarGraph); - currentColor.setForeground(colorForeGraph); + if (color != null) { + colorForeGraph = color; + } } else if (eventSource == syncWithName) { graphTitle.setText(namePanel.getName()); } else if (eventSource == dynamicGraphSize) { @@ -521,6 +593,19 @@ FilePanel filePanel = (FilePanel) getFilePanel(); filePanel.actionPerformed(event); } + } else if (eventSource instanceof JButton) { + // Changing color for column + JButton btn = ((JButton) eventSource); + if (btn.getName() != null) { + try { + BarGraph bar = eltList.get(Integer.parseInt(btn.getName())); + Color color = JColorChooser.showDialog(null, bar.getLabel(), bar.getBackColor()); + if (color != null) { + bar.setBackColor(color); + btn.setBackground(bar.getBackColor()); + } + } catch (NumberFormatException nfe) { } // nothing to do + } } } @@ -555,44 +640,58 @@ } private JPanel createGraphColumnPane() { - JPanel barPanel = new JPanel(); - barPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - - barPanel.add(createLabelCombo(JMeterUtils.getResString("aggregate_graph_column"), //$NON-NLS-1$ - columnsList)); + JPanel colPanel = new JPanel(); + colPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); - currentColor.setBorder(new EmptyBorder(2, 5, 2, 5)); - currentColor.setOpaque(true); - currentColor.setBackground(colorBarGraph); - - barPanel.add(Box.createRigidArea(new Dimension(5,0))); - barPanel.add(currentColor); - barPanel.add(Box.createRigidArea(new Dimension(5,0))); - barPanel.add(chooseBarColor); - chooseBarColor.addActionListener(this); - barPanel.add(Box.createRigidArea(new Dimension(5,0))); - barPanel.add(chooseForeColor); + JLabel label = new JLabel(JMeterUtils.getResString("aggregate_graph_columns_to_display")); //$NON-NLS-1$ + colPanel.add(label); + for (BarGraph bar : eltList) { + colPanel.add(bar.getChkBox()); + colPanel.add(createColorBarButton(bar, eltList.indexOf(bar))); + } + colPanel.add(Box.createRigidArea(new Dimension(5,0))); + chooseForeColor.setFont(FONT_SMALL); + colPanel.add(chooseForeColor); chooseForeColor.addActionListener(this); - barPanel.add(drawOutlinesBar); - barPanel.add(numberShowGrouping); + JPanel optionsPanel = new JPanel(); + optionsPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + optionsPanel.add(createGraphFontValuePane()); + optionsPanel.add(drawOutlinesBar); + optionsPanel.add(numberShowGrouping); + optionsPanel.add(valueLabelsVertical); + + JPanel barPane = new JPanel(new BorderLayout()); + barPane.add(colPanel, BorderLayout.NORTH); + barPane.add(Box.createRigidArea(new Dimension(0,3)), BorderLayout.CENTER); + barPane.add(optionsPanel, BorderLayout.SOUTH); JPanel columnPane = new JPanel(new BorderLayout()); columnPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), JMeterUtils.getResString("aggregate_graph_column_settings"))); // $NON-NLS-1$ - columnPane.add(barPanel, BorderLayout.NORTH); - columnPane.add(Box.createRigidArea(new Dimension(5,0)), BorderLayout.CENTER); + columnPane.add(barPane, BorderLayout.NORTH); + columnPane.add(Box.createRigidArea(new Dimension(0,3)), BorderLayout.CENTER); columnPane.add(createGraphSelectionSubPane(), BorderLayout.SOUTH); return columnPane; } - + + private JButton createColorBarButton(BarGraph barGraph, int index) { + // Button + JButton colorBtn = new JButton(); + colorBtn.setName(String.valueOf(index)); + colorBtn.setFont(FONT_SMALL); + colorBtn.addActionListener(this); + colorBtn.setBackground(barGraph.getBackColor()); + return colorBtn; + } + private JPanel createGraphSelectionSubPane() { Font font = new Font("SansSerif", Font.PLAIN, 10); // Search field JPanel searchPanel = new JPanel(); searchPanel.setLayout(new BoxLayout(searchPanel, BoxLayout.X_AXIS)); - searchPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + searchPanel.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0)); searchPanel.add(columnSelection); columnMatchLabel.setEnabled(false); @@ -644,6 +743,22 @@ return titlePane; } + private JPanel createGraphFontValuePane() { + JPanel fontValueStylePane = new JPanel(); + fontValueStylePane.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + fontValueStylePane.add(createLabelCombo(JMeterUtils.getResString("aggregate_graph_value_font"), //$NON-NLS-1$ + valueFontNameList)); + valueFontNameList.setSelectedIndex(0); // default: sans serif + fontValueStylePane.add(createLabelCombo(JMeterUtils.getResString("aggregate_graph_size"), //$NON-NLS-1$ + valueFontSizeList)); + valueFontSizeList.setSelectedItem(StatGraphProperties.fontSize[2]); // default: 10 + fontValueStylePane.add(createLabelCombo(JMeterUtils.getResString("aggregate_graph_style"), //$NON-NLS-1$ + valueFontStyleList)); + valueFontStyleList.setSelectedItem(JMeterUtils.getResString("fontstyle.normal")); // default: normal //$NON-NLS-1$ + + return fontValueStylePane; + } + private JPanel createGraphDimensionPane() { JPanel dimensionPane = new JPanel(); dimensionPane.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); @@ -704,7 +819,7 @@ legendPanel.add(createLabelCombo(JMeterUtils.getResString("aggregate_graph_legend_placement"), //$NON-NLS-1$ legendPlacementList)); - legendPlacementList.setSelectedItem(JMeterUtils.getResString("aggregate_graph_legend.placement.right")); // default: right + legendPlacementList.setSelectedItem(JMeterUtils.getResString("aggregate_graph_legend.placement.bottom")); // default: bottom legendPanel.add(createLabelCombo(JMeterUtils.getResString("aggregate_graph_font"), //$NON-NLS-1$ fontNameList)); fontNameList.setSelectedIndex(0); // default: sans serif Index: xdocs/usermanual/component_reference.xml =================================================================== --- xdocs/usermanual/component_reference.xml (revision 1311123) +++ xdocs/usermanual/component_reference.xml (working copy) @@ -2644,14 +2644,14 @@ - + The aggregate graph is similar to the aggregate report. The primary difference is the aggregate graph provides an easy way to generate bar graphs and save the graph as a PNG file.

The figure below shows an example of settings to draw this graph. -

Aggregate graph settings
+
Aggregate graph settings

Index: xdocs/images/screenshots/aggregate_graph.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: xdocs/images/screenshots/aggregate_graph_settings.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = image/png Index: xdocs/changes.xml =================================================================== --- xdocs/changes.xml (revision 1311123) +++ xdocs/changes.xml (working copy) @@ -173,6 +173,7 @@
  • Bug 52603 - MailerVisualizer : Enable SSL , TLS and Authentication
  • Bug 52698 - Remove Graph Full Results Listener
  • +
  • Bug 53070 - Change Aggregate graph to Clustered Bar chart, add more columns (median, 90% line, min, max) and options, fixed some bugs

Timers, Assertions, Config, Pre- & Post-Processors

Index: src/components/org/apache/jmeter/visualizers/BarGraph.java =================================================================== --- src/components/org/apache/jmeter/visualizers/BarGraph.java (revision 0) +++ src/components/org/apache/jmeter/visualizers/BarGraph.java (revision 0) @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jmeter.visualizers; + +import java.awt.Color; + +import javax.swing.JCheckBox; + +import org.apache.jmeter.util.JMeterUtils; + +public class BarGraph { + + private String label; + + private JCheckBox chkBox; + + private Color backColor; + + /** + * @param resString + * @param checked + * @param backColor + */ + public BarGraph(String resString, boolean checked, Color backColor) { + super(); + this.label = JMeterUtils.getResString(resString); + this.chkBox = new JCheckBox(this.label, checked); + this.backColor = backColor; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } + + /** + * @param label the label to set + */ + public void setLabel(String label) { + this.label = label; + } + + /** + * @return the chkBox + */ + public JCheckBox getChkBox() { + return chkBox; + } + + /** + * @param chkBox the chkBox to set + */ + public void setChkBox(JCheckBox chkBox) { + this.chkBox = chkBox; + } + + /** + * @return the backColor + */ + public Color getBackColor() { + return backColor; + } + + /** + * @param backColor the backColor to set + */ + public void setBackColor(Color backColor) { + this.backColor = backColor; + } + +}