/* * ------------------------------------------------------------------------- * $Id: Efficient.java,v 1.3 2004/05/26 18:08:33 estewart Exp $ * ------------------------------------------------------------------------- * Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved. * * This software is confidential information which is proprietary to * and a trade secret of Visual Numerics, Inc. Use, duplication or * disclosure is subject to the terms of an appropriate license * agreement. * * VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL * NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR * ITS DERIVATIVES. *-------------------------------------------------------------------------- */ package com.imsl.demo.Efficient; import com.imsl.chart.*; import com.imsl.stat.*; import java.awt.Color; import javax.swing.JLabel; import javax.swing.JOptionPane; import java.awt.image.BufferedImage; /** * * @author Kim Ju-Yeol * @created October 9, 2002 */ public class Efficient extends JFrameChart implements java.awt.event.MouseListener { private javax.swing.JPanel panel; private javax.swing.JLabel xstartValue, xendValue, ystartValue, yendValue; private javax.swing.JLabel jLabelLen; private javax.swing.JPopupMenu popup; private java.awt.Point saveReportLoc; private final java.awt.Cursor waitCursor = new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR); private final java.awt.Cursor defaultCursor = new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR); private AxisXY axis; private Data data; private Chart chart; private Computer computer; private InfoDialog info; private double[] results, expected_ret; public Efficient (boolean exitOnClose) { if (!exitOnClose) { Object l[] = getListeners(java.awt.event.WindowListener.class); for (int k = 0; k < l.length; k++) { removeWindowListener((java.awt.event.WindowListener) l[k]); } } com.imsl.demo.gallery.Describe des = new com.imsl.demo.gallery.Describe(this, "/com/imsl/demo/Efficient/Efficient.html"); des.show(); java.awt.Dimension dess = des.getSize(); computer = new Computer(); computer.initialize(); info = new InfoDialog(this, false); java.awt.Dimension is = info.getSize(); java.awt.Dimension ss = getToolkit().getScreenSize(); int w = Math.min(ss.width/2, ss.height-dess.height-32); if (w > dess.width-is.width) { w = dess.width - is.width; } setSize(w, w); setLocation(ss.width-dess.width+is.width, dess.height); setTitle("Efficient Frontier"); saveReportLoc = new java.awt.Point(ss.width-dess.width+is.width+w/4, dess.height+w/4); createChart(); initComponents(); // listen for mouse press events panel = getPanel(); panel.addMouseListener(this); drawChart(); info.setLocation(ss.width-dess.width, dess.height); info.setVisible(true); } private void createChart() { chart = getChart(); chart.getChartTitle().setTitle("Portfolio Selection Demo"); chart.getChartTitle().setFontSize(14); chart.getChartTitle().setTextColor("blue"); axis = new AxisXY(chart); axis.getAxisX().getAxisTitle().setTitle("Expected Return, %"); axis.getAxisY().getAxisTitle().setTitle("Level of Risk, %"); axis.getAxisX().setAutoscaleInput(AxisXY.AUTOSCALE_OFF); axis.setViewport(0.15, 0.9, 0.1, 0.8); } // Save a nimage using JAI private void genAsJAIBitmap() { System.out.println("genAsJAIBitmap()"); java.awt.Dimension sz = chart.getScreenSize(); java.awt.Image image = chart.getComponent().createImage((int)sz.getWidth(), (int)sz.getHeight()); chart.paintChart(image.getGraphics()); javax.media.jai.RenderedOp im = javax.media.jai.JAI.create("AWTImage", image); String filename = getFilename(); if (filename != "") { javax.media.jai.JAI.create("filestore", im, filename, "PNG"); java.io.File file = new java.io.File(filename); JOptionPane.showMessageDialog(this, "Finished Save As JAI\nFilename is " + filename, "Save As Results", JOptionPane.INFORMATION_MESSAGE); } } // Save an image using ImageIO private void genAsImageIOBitmap() { System.out.println("genAsImageIOBitmap()"); java.awt.Dimension sz = chart.getScreenSize(); int width = (int)sz.getWidth(); int height = (int)sz.getHeight(); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE); chart.paintChart(bi.getGraphics()); String filename = getFilename(); if (filename != "") { java.io.File file = new java.io.File(filename); try { javax.imageio.ImageIO.write(bi, "PNG", file); JOptionPane.showMessageDialog(this, "Finished Save As ImageIO\nFilename is " + filename, "Save As Results", JOptionPane.INFORMATION_MESSAGE); } catch (Exception e) { String name = e.toString().substring(0,e.toString().indexOf(':')); JOptionPane.showMessageDialog(this, e.getMessage(), name, JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } } private String getFilename() { System.out.println("getFilename()"); javax.swing.JFileChooser fileChooser = new javax.swing.JFileChooser(); //fileChooser.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG); fileChooser.setApproveButtonText("Save"); fileChooser.setApproveButtonToolTipText("Save with this file name"); fileChooser.setDialogTitle("Save As"); fileChooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_AND_DIRECTORIES); fileChooser.setCurrentDirectory(new java.io.File(".")); int result = fileChooser.showOpenDialog(this); if (result == javax.swing.JFileChooser.CANCEL_OPTION) return ""; java.io.File file = fileChooser.getSelectedFile(); String fileName = file.getPath(); if (fileName == null || fileName.equals("")) { JOptionPane.showMessageDialog(this,"Invalid File Name","Invalid File Name",JOptionPane.ERROR_MESSAGE); return ""; } else { return fileName; } } public Computer getComputer() { return computer; } // Update public void redrawChart() { axis.setAutoscaleInput(ChartNode.AUTOSCALE_DATA); data.remove(); drawChart(); } // Draw Chart private void drawChart() { results = Computer.getResults(); expected_ret = Computer.getExpected_ret(); String model_type; switch (computer.getModel()) { case 0: model_type = "EWMA"; break; case 1: model_type = "SMA"; break; case 2: model_type = "AHP"; break; default: model_type = "EWMA"; } Summary summary_x = new Summary(); summary_x.update(expected_ret); double xa = summary_x.getMinimum(); double xb = summary_x.getMaximum(); Summary summary_y = new Summary(); summary_y.update(results); double ya = summary_y.getMinimum(); double yb = summary_y.getMaximum(); data = new Data(axis, expected_ret, results); data.setDataType(Data.DATA_TYPE_LINE); data.setLineColor("red"); axis.getAxisX().setWindow(xa, xb); repaint(); // update the info box final java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); nf.setGroupingUsed(false); xstartValue.setText("[" + nf.format(xa)); ystartValue.setText("[" + nf.format(ya)); xendValue.setText(", " + nf.format(xb) + "]"); yendValue.setText(", " + nf.format(yb) + "]"); String length_data = Long.toString(results.length); StringBuffer sb = new StringBuffer(2048); sb.append("<html><body><font face='arial' size=4>"); sb.append("<p align='center'><b>"); sb.append("Statistical Model is " + model_type); sb.append("</b></p>"); sb.append("<p align='center'><font face='arial' size=3><b>"); sb.append("<center>Trial # : " + length_data + "</center>"); sb.append("</b></p>"); sb.append("<p align='center'><font face='arial' size=3><b>"); sb.append("<center>Input Parameters</center>"); sb.append("</b>"); sb.append("<p align='center'>"); sb.append("<table border=1 width=300>"); appendLine(sb); appendText(sb, "Commodity"); appendText(sb, "RETURN"); appendText(sb, "RISK"); closeLine(sb); String[] com = Computer.getCommodity(); double[] ret = Computer.getReturn(); double[] risk = Computer.getRisk(); final java.text.DecimalFormat df = new java.text.DecimalFormat("##0.00"); for (int i=0; i<com.length; i++) { appendLine(sb); appendText(sb, com[i]); appendRow(sb, df.format(ret[i])); appendRow(sb, df.format(risk[i])); closeLine(sb); } sb.append("</table></body></html>"); info.setText(sb.toString()); info.repaint(); } private void appendLine(StringBuffer sb) { sb.append("<tr width=100>"); } private void closeLine(StringBuffer sb) { sb.append("</tr>"); } private void appendText(StringBuffer sb, String title) { sb.append("<td align='center'><font face='arial' size=3><b>"); sb.append(title); sb.append("</td>"); } private void appendRow(StringBuffer sb, String value) { sb.append("<td align='center'><font face='arial' size=3>"); sb.append(value); sb.append("</td>"); } // Coordinate & Plot Information displays private void initComponents() { javax.swing.JPanel panelControl = new javax.swing.JPanel(); panelControl.setBackground(Color.white); panelControl.setLayout(new java.awt.GridLayout(2,1)); javax.swing.JPanel panelInfo = new javax.swing.JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.LEADING)); panelInfo.setBackground(Color.white); JLabel jLabelInfo = new JLabel("Data Source: ",JLabel.LEADING); JLabel jLabelLen = new JLabel("LG Insuarance Co. in Korea",JLabel.LEADING); jLabelInfo.setForeground(Color.blue); jLabelLen.setForeground(Color.blue); panelInfo.add(jLabelInfo); panelInfo.add(jLabelLen); javax.swing.JPanel panelXYvalue = new javax.swing.JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.LEADING)); panelXYvalue.setBackground(Color.white); JLabel title = new JLabel("Data Value for Region - ", JLabel.LEADING); JLabel xLabel = new JLabel(" X Range = ", JLabel.LEADING); xstartValue = new JLabel("", JLabel.TRAILING); xendValue = new JLabel("", JLabel.TRAILING); JLabel yLabel = new JLabel(" Y Range = ", JLabel.LEADING); ystartValue = new JLabel("", JLabel.TRAILING); yendValue = new JLabel("", JLabel.TRAILING); panelXYvalue.add(title); panelXYvalue.add(xLabel); panelXYvalue.add(xstartValue); panelXYvalue.add(xendValue); panelXYvalue.add(yLabel); panelXYvalue.add(ystartValue); panelXYvalue.add(yendValue); panelControl.add(panelInfo); panelControl.add(panelXYvalue); getContentPane().add(panelControl, java.awt.BorderLayout.SOUTH); // Add Pop Menu for Save Image in JFrameChart popup = new javax.swing.JPopupMenu(); javax.swing.JMenuItem jaimenu = new javax.swing.JMenuItem(); jaimenu.setText("Save as Image Using JAI"); jaimenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { popup.setVisible(false); setCursor(waitCursor); genAsJAIBitmap(); setCursor(defaultCursor); } }); javax.swing.JMenuItem imageIOmenu = new javax.swing.JMenuItem(); imageIOmenu.setText("Save as Image Using ImageIO"); imageIOmenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { popup.setVisible(false); setCursor(waitCursor); genAsImageIOBitmap(); setCursor(defaultCursor); } }); javax.swing.JMenuItem dataMenu = new javax.swing.JMenuItem(); dataMenu.setText("Save Data as Text"); dataMenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { popup.setVisible(false); String fileName = getFilename(); if (fileName != "") { setCursor(waitCursor); computer.saveData(panel, fileName); setCursor(defaultCursor); } } }); popup.add(jaimenu); popup.add(imageIOmenu); popup.add(dataMenu); popup.setOpaque(true); popup.setLightWeightPopupEnabled(true); } public void mousePressed(java.awt.event.MouseEvent mouseEvent) { if (mouseEvent.getButton() != 1) { popup.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } } public void mouseClicked(java.awt.event.MouseEvent mouseEvent) { } public void mouseEntered(java.awt.event.MouseEvent mouseEvent) { } public void mouseExited(java.awt.event.MouseEvent mouseEvent) { } public void mouseReleased(java.awt.event.MouseEvent mouseEvent) { } public static void main(String args[]) { boolean exitOnClose = true; if (args.length > 0 && args[0].equals("-noexit")) { exitOnClose = false; } new Efficient(exitOnClose).show(); } }