Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

new Thread(this)

http://codezine.jp/article/detail/193
こちらのソースを参考に、swingで作られているものをJavaFXにしてみようと思い、クライアント側のソースをいじっているのですが、71行目の
thread = new Thread(this);
で、コンパイルエラーを吐かれてしまいます。
一応Runnable型にもキャストしたら今度は実行時エラーを吐かれてしまいました。
参考ソースの方では、特にコンパイルエラーが起きなかったのですが、いったい何がコンパイルエラーの原因となってしまったのか教えていただけないでしょうか。
(以下書き直し途中のソースコードです)
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import java.io.*;
import java.net.Socket;

public class Main extends Application {
    @FXML TextField HostField;
    @FXML TextField PortField;
    @FXML TextField IdField;
    @FXML Label StatusField;
    @FXML PasswordField passwordField;
    Stage SignStage;
    Stage ClientStage;

    @Override
    public void start(Stage Stage) throws Exception {
        this.SignStage = new Stage();
        Parent root = FXMLLoader.load(getClass().getResource("UserSign.fxml"));
        this.SignStage.setTitle("Sign in");
        this.SignStage.setScene(new Scene(root));
        this.SignStage.setResizable(false);
        this.SignStage.show();
    }
    @Override
    public void stop() {
        if(socket == null) return;
        try {
            close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //サインインボタンのイベント定義
    @FXML
    private void Sign_in(ActionEvent a) {
        //入力フォームに対する空白の禁止
        if(HostField.getText().equals("") || PortField.getText().equals("") || IdField.getText().equals("") || passwordField.getText().equals("")) {
            StatusField.setText("入力項目に空欄が存在します");
            return;
        }
        this.HOST = HostField.getText();
        this.PORT = Integer.valueOf(PortField.getText());
        connectServer();
        passwordField.setText("");
        IdField.setText("");
    }
    public static void main(String[] args) {
        launch(args);
        new Main();
    }
    //接続先サーバーのホスト名
    private static String HOST;
    //接続先ポート番号
    private static int PORT;
    //このアプリケーションのクライアントソケット
    private Socket socket;
    //メッセージ受信監視用スレッド
    private Thread thread;

    public Main() {
        //メッセージ受信用に
        thread = new Thread(this);
        thread.start();
        run();
    }
     //サーバーに接続する
     public void connectServer() {
        try {
            socket = new Socket(HOST, PORT);
            sendMessage("sign " + passwordField.getText() + " " + IdField.getText());
        } catch(Exception err) {
            StatusField.setText("サーバーに接続不能な状況か、\n" +
                    "ホスト名かポート番号が間違っています");
        }
     }
    //サーバーから切断する
    public void close() throws IOException {
        sendMessage("close");
        socket.close();
    }
    //メッセージをサーバーに送信する
    public void sendMessage(String msg) {
        try {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output);
            System.out.println(msg);
            writer.println(msg);
            writer.flush();
        }
        catch(Exception err) {
        //    msgTextArea.append("ERROR>" + err + "\n");
        }
    }
    //メッセージ監視用のスレッド
    public void run() {
        try {
            System.out.println("メッセージ受信");
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            while(!socket.isClosed()) {
                String line = reader.readLine();

                String[] msg = line.split(" ", 2);
                String msgName = msg[0];
                String msgValue = (msg.length < 2 ? "" : msg[1]);
                reachedMessage(msgName, msgValue);
            }
        }
        catch(Exception err) { }
    }
    //サーバーから送られてきたメッセージの処理
    public void reachedMessage(String name, String value) {
        //チャットルームのリストに変更が加えられた
        if (name.equals("rooms")) {
            if (value.equals("")) {
//                roomList.setModel(new DefaultListModel());
            }
            else {
                String[] rooms = value.split(" ");
//                roomList.setListData(rooms);
            }
        }
        //ユーザーが入退室した
        else if (name.equals("users")) {
            if (value.equals("")) {
//                userList.setModel(new DefaultListModel());
            }
            else {
                String[] users = value.split(" ");
//                userList.setListData(users);
            }
        }
        //メッセージが送られてきた
        else if (name.equals("msg")) {
//            msgTextArea.append(value + "\n");
        }
        //処理に成功した
        else if (name.equals("successful")) {
            if (value.equals("setName")) { //msgTextArea.append(">名前を変更しました\n");
            } else if(value.equals("sign")) {
                System.out.println("ログイン要求が承認されました");
                ClientShow();
                this.SignStage.hide();
                //((Node)a.getSource()).getScene().getWindow().hide();
            }
        }
        else if (name.equals("failed")) {
            if (value.equals("sign")) {
                try {
                    close();
                } catch (IOException err) {
                    err.printStackTrace();
                }
            }
        }
        //エラーが発生した
        else if (name.equals("error")) {
//            msgTextArea.append("ERROR>" + value + "\n");
        }
    }
    public void ClientShow() {
        ClientStage = new Stage();
        Parent clientroot;
        try {
            clientroot = FXMLLoader.load(getClass().getResource("Harmony.fxml"));
        } catch (IOException e) {
            clientroot = null;
            e.printStackTrace();
        }
        if(clientroot == null) return;
        ClientStage.setScene(new Scene(clientroot));
        ClientStage.show();
    }
}

2

回答

325

閲覧

2件の回答

評価

0

クラスとは、型とは、キャストとは…そういう基本が理解できていなければ、
異なるアーキテクチャへの書き換えは簡単な話ではない。
JavaFXはいったん置いて、基礎を咀嚼して消化することを考えてみよう。
それができた後に

>一応Runnable型にもキャストしたら

を見たら、自分でも「そりゃ、できるわけないよな…」と、きっと思うだろう。

「急がば回れ」だよ。

評価

0

回答ありがとうございます

よくよく教本や、Webを見て何してんだろうという気持ちになりました
解決手段としてはRunnableインターフェースをimplementsすることによって解決しました

また上記ソースコードではMainコンストラクタ中でスレッドを生成しているのでrun()の処理がうまくいかないことも発見できました

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名