package info.istlab.ServerTester; import java.awt.Color; import java.awt.Desktop; import java.awt.event.ComponentAdapter; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Hashtable; import java.util.Iterator; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; public class RemoteHostsWindow extends JPanel { JTabbedPane tabbedPane; Hashtable<String, RemoteHostPanel> panels = new Hashtable<String, RemoteHostPanel>(); JFrame frame; boolean autoPack = true; // ウィンドウをリサイズしたら、falseにする。再度開いたときにtrueにする。 public RemoteHostsWindow(Hashtable<String, String> receivedData) { frame = new JFrame(); frame.setTitle("Remote Hosts"); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent windowEvent) { frame.setVisible(false); } }); frame.addComponentListener(new ComponentAdapter() { @Override public void componentResized(java.awt.event.ComponentEvent e) { autoPack = false; } }); tabbedPane = new JTabbedPane(); frame.getContentPane().add(tabbedPane); Iterator<String> it = receivedData.keySet().iterator(); while (it.hasNext()) { String addr = it.next(); String value = receivedData.get(addr); RemoteHostPanel rhp = new RemoteHostPanel(addr, value); tabbedPane.add(addr, rhp); panels.put(addr, rhp); } frame.setLocation(Host.mainhost.nextTo(10,10)); frame.pack(); frame.setVisible(true); } public void updateData(String addr, String value) { RemoteHostPanel rhp = panels.get(addr); if (rhp != null) { rhp.renewal(value); tabbedPane.validate(); tabbedPane.repaint(); // System.out.println("Tab updated " + addr); // System.out.println(value); } else { rhp = new RemoteHostPanel(addr, value); tabbedPane.add(addr, rhp); panels.put(addr, rhp); } packIfNotResized(); } public void packIfNotResized() { if (autoPack) { frame.pack(); } } } class RemoteHostPanel extends JPanel { String hostip; public RemoteHostPanel(String _hostip, String value) { hostip = _hostip; setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // System.out.println(value); fillPanels(value); } public void addnew(String value) { fillPanels(value); } private void fillPanels(String value) { String[] servers = value.split("\n"); for (String server : servers) { if (server.length() < 2) { continue; } // ex: WebServer 8081 127.0.0.1 Running String[] info = server.split(" "); // System.out.println(server); JPanel panel = new JPanel(); panel.add(new JLabel(info[0])); panel.add(new JLabel(info[1])); JLabel addressLabel = new JLabel(info[2]); if (info[2].equals("127.0.0.1")) { addressLabel.setForeground(Color.red); } panel.add(addressLabel); panel.add(new JLabel(info[3])); JButton button = new JButton("Connect"); panel.add(button); if (info[3].equals("Running")) { button.setEnabled(true); } else { button.setEnabled(false); } button.addActionListener(e -> { // もしbind addressが0.0.0.0だったら、hostipを使う String target = info[2]; if (target.equals("0.0.0.0")) { target = hostip; } if (target.equals("127.0.0.1")) { target = hostip; } if (info[0].startsWith("Web")) { // open web browser Desktop desktop = Desktop.getDesktop(); try { desktop.browse(new URI("http://" + target + ":" + info[1])); } catch (IOException | URISyntaxException e1) { } } else if (info[0].startsWith("Echo") || info[0].startsWith("ThreadEcho")) { new JExecutor("EchoClient", info[1] + " " + target); // new EchoClient(info[1], target); } else if (info[0].startsWith("Time") || info[0].startsWith("ThreadTime")) { new JExecutor("TimeClient", info[1] + " " + target); // new TimeClient(info[1], target); } else if (info[0].startsWith("WhiteBoard")) { new JExecutor("WhiteBoardClient", info[1] + " " + target); // new WhiteBoardClient(info[1], target); } }); add(panel); } } public void renewal(String value) { removeAll(); fillPanels(value); validate(); } }