package info.istlab.ServerTester; import java.awt.Color; import java.awt.Desktop; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; /** * サーバの状態を表示するパネル for SimpleWebSocketServer */ public class ServerPanel4WS extends JPanel implements Runnable { Host host; SimpleWebSocketServer server; String name; JLabel portLabel; JLabel addressLabel; JLabel statusLabel; JButton stopButton; Thread thread; JButton delButton; JButton clientButton; /** * Create the panel. */ public ServerPanel4WS(SimpleWebSocketServer _server, Host _host) { server = _server; host = _host; name = _server.getClass().getName(); // remove package name name = name.substring(name.lastIndexOf('.') + 1); JLabel lblNewLabel = new JLabel(name); add(lblNewLabel); portLabel = new JLabel(); add(portLabel); addressLabel = new JLabel(); add(addressLabel); statusLabel = new JLabel(); add(statusLabel); stopButton = new JButton("Start"); add(stopButton); stopButton.addActionListener(e -> { if (server.isClosed()) { server = new SimpleWebSocketServer(server.getExpectedPort(), server.getExpectedAddress()); } else { server.stop(); } repaint(); host.pack(); }); delButton = new JButton("Delete"); delButton.setEnabled(false); delButton.addActionListener(e -> { server.stop(); Host.mainhost.mainPanel.remove(this); Host.mainhost.pack(); }); add(delButton); clientButton = new JButton("Client"); add(clientButton); clientButton.addActionListener(e -> { if (name.startsWith("Web")) { // open web browser Desktop desktop = Desktop.getDesktop(); try { desktop.browse(new URI("http://" + server.getBindAddress() + ":" + server.getPort())); } catch (IOException | URISyntaxException e1) { } } else if (name.startsWith("Echo") || name.startsWith("ThreadEcho")) { new JExecutor("EchoClient", server.getPort() + " " + server.getBindAddress()); // new EchoClient(server.getPort(), server.getBindAddress()); } else if (name.startsWith("Time") || name.startsWith("ThreadTime")) { new JExecutor("TimeClient", server.getPort() + " " + server.getBindAddress()); // new TimeClient(server.getPort(), server.getBindAddress()); } else if (name.startsWith("WhiteBoard")) { new JExecutor("WhiteBoardClient", server.getPort() + " " + server.getBindAddress()); // new WhiteBoardClient(server.getPort(), server.getBindAddress()); } }); thread = new Thread(this); thread.start(); } @Override public void run() { while (thread != null) { if (server.isClosed()) { portLabel.setText(String.valueOf(server.getExpectedPort())); addressLabel.setText(server.getExpectedAddress()); if (server.bindFailed) { statusLabel.setText("Closed (Bind失敗)"); } else { statusLabel.setText("Closed"); } stopButton.setText("Restart"); delButton.setEnabled(true); clientButton.setEnabled(false); } else { portLabel.setText(String.valueOf(server.getExpectedPort())); addressLabel.setText(server.getExpectedAddress()); statusLabel.setText("Running"); stopButton.setText("Stop"); delButton.setEnabled(false); clientButton.setEnabled(true); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void paintComponent(Graphics g) { super.paintComponent(g); Color color1 = Color.yellow; Color color2 = Color.orange; if (server.isClosed()) { } else { color1 = Color.cyan; color2 = new Color(100, 100, 255); } // Graphics2D オブジェクトを取得 Graphics2D g2d = (Graphics2D) g; // パネルの幅と高さを取得 int width = getWidth(); int height = getHeight(); // グラデーションを設定(左上から右下にかけて) GradientPaint gradientPaint = new GradientPaint(width / 4, 0, color1, width, height, color2); // グラデーションで塗りつぶす g2d.setPaint(gradientPaint); g2d.fillRect(0, 0, width, height); g2d.setColor(Color.lightGray); g2d.drawRect(0, 0, width - 1, height - 1); } public String getAvailableServices() { if (!server.isClosed()) { return name + " " + server.getExpectedPort() + " " + server.getExpectedAddress() + " Running"; } else { return name + " " + server.getExpectedPort() + " " + server.getExpectedAddress() + " Closed"; } } }