Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / ServerPanel4WS.java
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";
        }
    }
}