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); }