package fucoin.gui; import fucoin.supervisor.SuperVisorImpl; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class SuperVisorGuiControlImpl implements SuperVisorGuiControl { private SuperVisorImpl superVisor; private JFrame frame; private DefaultListModel<String> log = new DefaultListModel<>(); private JList<String> txtLog = new JList<>(log); private JScrollPane logPane = new JScrollPane(txtLog); public SuperVisorGuiControlImpl(SuperVisorImpl sv) { superVisor = sv; init(); } private void init() { //Show AWT window for runtime information frame = new JFrame("Server"); JPanel contentPanel = new JPanel(); contentPanel.setLayout(new GridLayout(2, 1)); //Init Amount Table and SuperVisorImpl JTable amountListView = new JTable(superVisor.getAmountTableModel()); contentPanel.add(new JScrollPane(amountListView)); contentPanel.add(logPane); frame.add(contentPanel, BorderLayout.CENTER); //Exit Button and shutdown supervisor JButton exitBtn = new JButton("Stop Supervisor"); exitBtn.addActionListener(e -> { superVisor.exit(); frame.setVisible(false); frame.dispose(); }); frame.add(exitBtn, BorderLayout.PAGE_END); frame.setSize(800, 600); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); superVisor.exit(); } }); } @Override public void onLeave() { frame.dispose(); } @Override public void log(String message) { // One day, we may have a server log GUI as well.. // Until then, we just print it to the console //System.out.println(message); SwingUtilities.invokeLater(() -> { log.addElement(message); // auto scroll to the bottom txtLog.ensureIndexIsVisible(log.size() - 1); }); } }