From 5e92eae32f30bfbd14e69d4360c79c86f3703fc6 Mon Sep 17 00:00:00 2001 From: asdfasdf Date: Sun, 24 Nov 2019 13:07:11 -0800 Subject: [PATCH] Added Buttons --- README.md | 1 - src/main/data/StockEntry.java | 7 +++ src/main/data/WatchList.java | 7 ++- src/main/network/AlphaVantage.java | 1 - src/main/ui/Gui.java | 73 ++++++++++++++++++++---- src/main/ui/IfaceFactory.java | 4 +- src/main/ui/guicomp/AddButt.java | 19 ++++++ src/main/ui/guicomp/DelButt.java | 19 ++++++ src/main/ui/guicomp/UpButt.java | 18 ++++++ src/main/ui/guicomp/WatchTableModel.java | 50 ++++++++++++++++ 10 files changed, 184 insertions(+), 15 deletions(-) create mode 100644 src/main/ui/guicomp/AddButt.java create mode 100644 src/main/ui/guicomp/DelButt.java create mode 100644 src/main/ui/guicomp/UpButt.java create mode 100644 src/main/ui/guicomp/WatchTableModel.java diff --git a/README.md b/README.md index a58a2c7..a1489f2 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,3 @@ Rebuild tags with: ``` gradle tags ``` - diff --git a/src/main/data/StockEntry.java b/src/main/data/StockEntry.java index d1fe677..6c5875d 100644 --- a/src/main/data/StockEntry.java +++ b/src/main/data/StockEntry.java @@ -7,6 +7,7 @@ public class StockEntry { private StockType stype; private double price; private double change; + private boolean updating = false; public StockEntry(StockType stype, String idstring) { identifier = idstring; @@ -14,9 +15,11 @@ public class StockEntry { } public void update() { + updating = true; double[] result = this.stype.update(this.identifier); this.price = result[0]; this.change = result[1]; + updating = false; } public String getTypeName() { @@ -35,6 +38,10 @@ public class StockEntry { return change; } + public boolean isUpdating() { + return updating; + } + @Override public boolean equals(Object obj) { if (obj == this) { diff --git a/src/main/data/WatchList.java b/src/main/data/WatchList.java index 9682faa..451ef9e 100644 --- a/src/main/data/WatchList.java +++ b/src/main/data/WatchList.java @@ -58,7 +58,12 @@ public class WatchList extends Subject implements Load,Save { Set entryset = Collections.unmodifiableSet(listdata.entrySet()); return entryset.iterator(); } - + + //XXX index access method + public StockEntry getStock(int index) { + return (StockEntry) listdata.entrySet().toArray()[index]; + } + // Effects: Return the size of list public int size() { return listdata.size(); diff --git a/src/main/network/AlphaVantage.java b/src/main/network/AlphaVantage.java index 712d0c3..dc0acec 100644 --- a/src/main/network/AlphaVantage.java +++ b/src/main/network/AlphaVantage.java @@ -34,5 +34,4 @@ public class AlphaVantage extends DataSource { } return result; } - } diff --git a/src/main/ui/Gui.java b/src/main/ui/Gui.java index 94e2da4..9fc8367 100644 --- a/src/main/ui/Gui.java +++ b/src/main/ui/Gui.java @@ -1,18 +1,69 @@ package ui; -import javax.swing.*; +import javax.swing.SwingUtilities; +import javax.swing.JFrame; +import javax.swing.JComponent; +import javax.swing.JButton; +import javax.swing.GroupLayout; +import java.awt.Container; +import java.awt.LayoutManager; +import ui.guicomp.*; +import static data.Const.PROGRAM_NAME; +import javax.swing.GroupLayout.Alignment; -public class Gui { - //public Gui() { - // JLabel label = new JLabel("Hello World"); +// based on http://zetcode.com/tutorials/javaswingtutorial/firstprograms/ +public class Gui extends JFrame implements Iface { + private JButton addButton; + private JButton delButton; + private JButton upButton; + private Runnable init = new Runnable() { + public void run() { + addComponents(); + createLayout(); + setTitle(PROGRAM_NAME); + setSize(300, 200); + setLocationRelativeTo(null); + setDefaultCloseOperation(EXIT_ON_CLOSE); + } - // JFrame.setDefaultLookAndFeelDecorated(true); - // JFrame f = new JFrame("Hello World"); - // f.setSize(300,150); - // f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + private void addComponents() { + addButton = new AddButt(); + delButton = new DelButt(); + upButton = new UpButt(); + } - // f.add(label); + private void createLayout() { + Container pane = getContentPane(); + GroupLayout lman = new GroupLayout(pane); + pane.setLayout(lman); + lman.setAutoCreateContainerGaps(true); + lman.setHorizontalGroup(lman.createParallelGroup(GroupLayout.Alignment.CENTER) + .addGroup(lman.createSequentialGroup() + .addComponent(addButton) + .addComponent(delButton) + .addComponent(upButton) + )); + lman.setVerticalGroup(lman.createSequentialGroup() + .addGroup(lman.createParallelGroup(GroupLayout.Alignment.CENTER) + .addComponent(addButton) + .addComponent(delButton) + .addComponent(upButton) + )); + } + }; - // f.setVisible(true); - //} + public Gui() { + SwingUtilities.invokeLater(init); + setVisible(true); + } + + @Override + public void redraw() { + //Nothing for now + } + + @Override + public void destory() { + //Nothing for now + } } diff --git a/src/main/ui/IfaceFactory.java b/src/main/ui/IfaceFactory.java index 3683da5..01db041 100644 --- a/src/main/ui/IfaceFactory.java +++ b/src/main/ui/IfaceFactory.java @@ -6,6 +6,8 @@ public class IfaceFactory { // Produce Iface given the config public static Iface getIface() { //uses Tui for now - return new Tui(); + //return new Tui(); + //Test Gui + return new Gui(); } } diff --git a/src/main/ui/guicomp/AddButt.java b/src/main/ui/guicomp/AddButt.java new file mode 100644 index 0000000..9750b86 --- /dev/null +++ b/src/main/ui/guicomp/AddButt.java @@ -0,0 +1,19 @@ +package ui.guicomp; + +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class AddButt extends JButton { + public AddButt() { + super("Add Stock..."); + addActionListener(new AddButtList()); + } + + private class AddButtList implements ActionListener { + public void actionPerformed(ActionEvent e) { + //XXX Ask for input dialogue + //https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html#input + } + } +} diff --git a/src/main/ui/guicomp/DelButt.java b/src/main/ui/guicomp/DelButt.java new file mode 100644 index 0000000..4f34756 --- /dev/null +++ b/src/main/ui/guicomp/DelButt.java @@ -0,0 +1,19 @@ +package ui.guicomp; + +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class DelButt extends JButton { + public DelButt() { + super("Remove Stock..."); + addActionListener(new DelButtList()); + } + + private class DelButtList implements ActionListener { + public void actionPerformed(ActionEvent e) { + //XXX Ask for input dialogue + //https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html#input + } + } +} diff --git a/src/main/ui/guicomp/UpButt.java b/src/main/ui/guicomp/UpButt.java new file mode 100644 index 0000000..419b7c0 --- /dev/null +++ b/src/main/ui/guicomp/UpButt.java @@ -0,0 +1,18 @@ +package ui.guicomp; + +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class UpButt extends JButton { + public UpButt() { + super("Update"); + addActionListener(new UpButtList()); + } + + private class UpButtList implements ActionListener { + public void actionPerformed(ActionEvent e) { + //XXX Update WatchList + } + } +} diff --git a/src/main/ui/guicomp/WatchTableModel.java b/src/main/ui/guicomp/WatchTableModel.java new file mode 100644 index 0000000..4a6d1d6 --- /dev/null +++ b/src/main/ui/guicomp/WatchTableModel.java @@ -0,0 +1,50 @@ +package ui.guicomp; + +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableModel; +import javax.swing.event.*; +import data.WatchList; +import data.StockEntry; + +// Ref: https://docs.oracle.com/javase/tutorial/uiswing/components/table.html +// Ref2: https://docs.oracle.com/javase/8/docs/api/javax/swing/table/AbstractTableModel.html +public class WatchTableModel extends AbstractTableModel { + private final String[] colnames = {"Identifier", "Price", "% change", "Status"}; + private WatchList watch; + + public WatchTableModel(WatchList wlist) { + watch = wlist; + } + + public int getColumnCount() { + return colnames.length; + } + + public int getRowCount() { + return watch.size(); + } + + public String getColumnName(int num) { + return colnames[num]; + } + + public Object getValueAt(int stock, int field) { + StockEntry entry = watch.getStock(stock); + switch (field) { + case 0: //Name + return entry.getID(); + case 1: //Price + return entry.getPrice(); + case 2: //% change + return entry.getChange() + " %"; + case 3: + return entry.isUpdating() ? "Updating" : "Ok"; + default: + return false; + } + } + + public Class getColumnClass(int col) { + return getValueAt(0,col).getClass(); + } +}