Beispiel #1
0
  public static void main(String[] args) {
    Chart shc = new Chart("C:/TEMP/table.csv");

    JFrame frame = new JFrame("Stock History Chart for " + shc.getSymbol());
    frame.getContentPane().add(shc, BorderLayout.CENTER);
    frame.setSize(640, 480);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  // Main code for creating charts
  public void createChart(ChartViewer viewer, int chartIndex) {
    // The data for the bar chart
    double[] data = {450, 560, 630, 800, 1100, 1350, 1600, 1950, 2300, 2700};

    // The labels for the bar chart
    String[] labels = {
      "1996", "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005"
    };

    // Create a XYChart object of size 600 x 360 pixels
    XYChart c = new XYChart(600, 360);

    // Add a title to the chart using 18pt Times Bold Italic font
    c.addTitle("Annual Revenue for Star Tech", "Times New Roman Bold Italic", 18);

    // Set the plotarea at (60, 40) and of size 500 x 280 pixels. Use a vertical gradient color
    // from light blue (eeeeff) to deep blue (0000cc) as background. Set border and grid lines
    // to white (ffffff).
    c.setPlotArea(
        60,
        40,
        500,
        280,
        c.linearGradientColor(60, 40, 60, 280, 0xeeeeff, 0x0000cc),
        -1,
        0xffffff,
        0xffffff);

    // Add a multi-color bar chart layer using the supplied data. Use soft lighting effect with
    // light direction from left.
    c.addBarLayer3(data).setBorderColor(Chart.Transparent, Chart.softLighting(Chart.Left));

    // Set x axis labels using the given labels
    c.xAxis().setLabels(labels);

    // Draw the ticks between label positions (instead of at label positions)
    c.xAxis().setTickOffset(0.5);

    // Add a title to the y axis with 10pt Arial Bold font
    c.yAxis().setTitle("USD (millions)", "Arial Bold", 10);

    // Set axis label style to 8pt Arial Bold
    c.xAxis().setLabelStyle("Arial Bold", 8);
    c.yAxis().setLabelStyle("Arial Bold", 8);

    // Set axis line width to 2 pixels
    c.xAxis().setWidth(2);
    c.yAxis().setWidth(2);

    // Output the chart
    viewer.setChart(c);

    // include tool tip for the chart
    viewer.setImageMap(c.getHTMLImageMap("clickable", "", "title='Year {xLabel}: US$ {value}M'"));
  }
  /**
   * Utility method that will calculate a new mortgage payment and payment breakdown based on the
   * user's current selection.
   */
  private void calculateMortgage() {
    boolean inputValid = true;

    // fetch the new values from the data entry fields and calculate a
    // new mortgage
    double principal = 0.0;
    try {
      final String principalText = fieldPrincipal.getText();
      principal = FMT_PRINCIPAL.parse(principalText).doubleValue();
      if (principal <= 0.0) {
        invalidInput(fieldPrincipal, MSG_PRINCIPAL_NEGATIVE);
        inputValid = false;
      }
    } catch (ParseException ex) {
      invalidInput(fieldPrincipal, MSG_INVALID_INPUT);
      inputValid = false;
    }

    double rate = 0.0;
    if (inputValid) {
      try {
        final String rateText = fieldRate.getText();
        rate = FMT_RATE.parse(rateText).doubleValue();
        if (rate <= 0.0) {
          invalidInput(fieldRate, MSG_RATE_NEGATIVE);
          inputValid = false;
        }
      } catch (ParseException ex) {
        invalidInput(fieldRate, MSG_INVALID_INPUT);
        inputValid = false;
      }
    }

    int term = 0;
    if (inputValid) {
      try {
        final String termText = fieldTerm.getText();
        term = FMT_TERM.parse(termText).intValue();
        if (term <= 0) {
          invalidInput(fieldTerm, MSG_TERM_NEGATIVE);
          inputValid = false;
        }
      } catch (ParseException ex) {
        invalidInput(fieldTerm, MSG_INVALID_INPUT);
        inputValid = false;
      }
    }

    if (inputValid) {
      // create a new Mortgage object from the selected mortgage terms and
      // then update the principal with the user's requested value
      final Mortgage mortgage = new Mortgage(principal, rate, term);

      // format the mortgage payment into a user-friendly message
      final Object[] values = {new Double(mortgage.getPayment())};
      final String message = MessageFormat.format(MSG_PAYMENT, values);

      // update our message label and payment data and force our UI
      // to repaint itself with the new mortgage results
      labelMessage.setText(message);
      paymentsModel.setPayments(mortgage.getPayments());

      // create a data set so the chart may be updated with the mortgage
      // payment detail
      final MortgagePayment[] payments = mortgage.getPayments();
      final double[][] chartData = new double[2][payments.length];
      for (int i = 0; i < payments.length; i++) {
        chartData[0][i] = payments[i].getInterest().doubleValue();
        chartData[1][i] = payments[i].getPrincipal().doubleValue();
      }

      final String[] chartDataNames = {"Interest", "Principal"};
      final NumberFormat[] formats = {new DecimalFormat("#,##0"), new DecimalFormat("$ #,##0.00")};

      paymentsChart.setData(chartData, chartDataNames, formats);

      repaint();
    }
  }
 /**
  * Utility method that will reset the mortgage to an empty value and inform the user they need to
  * recalculate.
  */
 private void resetMortgage() {
   labelMessage.setText(MSG_CALCULATE);
   paymentsChart.clearData();
   paymentsModel.setPayments(new MortgagePayment[0]);
   repaint();
 }
  /** Creates all of the UI components used by this application. */
  private void createComponents() {
    // the data entry fields need their focus watched...
    final FocusWatcher focusWatcher = new FocusWatcher();

    // create the label and field for the mortgage principal amount
    fieldPrincipal = new JTextField();
    fieldPrincipal.addFocusListener(focusWatcher);
    fieldPrincipal.setColumns(FIELD_COLUMNS);

    labelPrincipal = new JLabel(LABEL_PRINCIPAL);
    labelPrincipal.setLabelFor(fieldPrincipal);

    // create the label and field for the mortgage terms combo-box/list
    fieldMortgageChoices = new JComboBox();
    fieldMortgageChoices.addActionListener(new FieldActionListener());

    labelMortgageChoices = new JLabel(LABEL_MORTGAGE_CHOICES);
    labelMortgageChoices.setLabelFor(fieldMortgageChoices);

    // create the label and field for the mortgage term period
    fieldTerm = new JTextField();
    fieldTerm.addFocusListener(focusWatcher);
    fieldTerm.setColumns(FIELD_COLUMNS);

    labelTerm = new JLabel(LABEL_TERM);
    labelTerm.setLabelFor(fieldTerm);

    // create the label and field for the mortgage annual interest rate
    fieldRate = new JTextField();
    fieldRate.addFocusListener(focusWatcher);
    fieldRate.setColumns(FIELD_COLUMNS);

    labelRate = new JLabel(LABEL_RATE);
    labelRate.setLabelFor(fieldRate);

    // create the label that will provide the header text for the panel
    labelHeader = new JLabel(MSG_HEADER);

    // create the label that will provide any mesages to the user,
    // including the newly calculated mortgage payment amounts
    labelMessage = new JLabel("");

    // create a chart used to display the mortgage payment detail; a small
    // pixel size is used so our primary window isn't sized too large
    paymentsChart = new Chart(320, 240);
    paymentsChart.setBorder(BorderFactory.createLineBorder(Color.BLACK));

    // TODO
    paymentsModel = new MortgagePaymentsTableModel();
    paymentsTable = new JTableHelper(paymentsModel);
    paymentsTable.setColumnSelectionAllowed(false);
    paymentsTable.setRowSelectionAllowed(true);
    paymentsTable.setDefaultRenderer(Double.class, new CurrencyRenderer());

    // create the button that will allow the user to calculate a mortgage
    // payment schedule from the current input
    final Action calcAction = new CalcAction();
    calcButton = new JButton(calcAction);
    getRootPane().setDefaultButton(calcButton);

    // set default values for all of the fields to make the user feel cozy
    fieldPrincipal.setText(FMT_PRINCIPAL.format(DEFAULT_PRINCIPAL));
    fieldRate.setText(FMT_RATE.format(DEFAULT_RATE));
    fieldTerm.setText(FMT_TERM.format(DEFAULT_TERM));

    // watch the documents of our input fields so that we can reset our
    // current mortgage calculate whenever the user changes anything
    final DocumentListener docWatcher = new DocumentWatcher();
    fieldPrincipal.getDocument().addDocumentListener(docWatcher);
    fieldRate.getDocument().addDocumentListener(docWatcher);
    fieldTerm.getDocument().addDocumentListener(docWatcher);
  }