Java tutorial
/* * Copyright 2002-2010 the original author or authors. * * Licensed 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.springframework.amqp.rabbit.stocks.ui; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DecimalFormat; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.amqp.rabbit.stocks.domain.Quote; import org.springframework.amqp.rabbit.stocks.domain.Stock; import org.springframework.amqp.rabbit.stocks.domain.TradeResponse; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * A typical poor mans UI to drive the application. * * @author Mark Pollack * @author Mark Fisher */ @SuppressWarnings("serial") public class StockPanel extends JPanel { private static Log log = LogFactory.getLog(StockPanel.class); private JTextField tradeRequestTextField; private JButton tradeRequestButton; private JTextArea marketDataTextArea; private StockController stockController; private DecimalFormat frmt = new DecimalFormat("$0.00"); public StockPanel(StockController controller) { this.stockController = controller; controller.setStockPanel(this); this.setBorder(BorderFactory.createTitledBorder("Stock Form")); FormLayout formLayout = new FormLayout("pref, 150dlu", // columns "pref, fill:100dlu:grow"); // rows setLayout(formLayout); CellConstraints c = new CellConstraints(); tradeRequestButton = new JButton("Send Trade Request"); add(tradeRequestButton, c.xy(1, 1)); tradeRequestTextField = new JTextField(""); add(tradeRequestTextField, c.xy(2, 1)); add(new JLabel("Market Data"), c.xy(1, 2)); marketDataTextArea = new JTextArea(); JScrollPane sp = new JScrollPane(marketDataTextArea); sp.setSize(200, 300); add(sp, c.xy(2, 2)); tradeRequestTextField.addFocusListener(new FocusListener() { public void focusLost(FocusEvent e) { } public void focusGained(FocusEvent e) { tradeRequestTextField.setText(""); tradeRequestTextField.setForeground(Color.BLACK); } }); tradeRequestButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sendTradeRequest(); } }); } private void sendTradeRequest() { try { stockController.sendTradeRequest(tradeRequestTextField.getText()); tradeRequestTextField.setForeground(Color.GRAY); tradeRequestTextField.setText("Request Pending..."); log.info("Sent trade request."); } catch (Exception ex) { tradeRequestTextField.setForeground(Color.RED); tradeRequestTextField.setText("Required Format: 100 TCKR"); } } public static void main(String[] a) { ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("client-bootstrap-config.xml"); StockController controller = context.getBean(StockController.class); JFrame f = new JFrame("Rabbit Stock Demo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //TODO consider @Configurable f.add(new StockPanel(controller)); f.pack(); f.setVisible(true); } public void displayQuote(final Quote quote) { SwingUtilities.invokeLater(new Runnable() { public void run() { Stock stock = quote.getStock(); marketDataTextArea.append(stock.getTicker() + " " + quote.getPrice() + "\n"); } }); } public void update(final TradeResponse tradeResponse) { SwingUtilities.invokeLater(new Runnable() { public void run() { tradeRequestTextField.setForeground(Color.GREEN); tradeRequestTextField.setText("Confirmed. " + tradeResponse.getTicker() + " " + frmt.format(tradeResponse.getPrice().doubleValue())); } }); } }