执行网络代码后 Java UI 白屏

标签 java user-interface networking

我想在我的游戏中实现网络功能,但是我有一个很大的问题。当我尝试创建 JFrame 组件时,执行网络代码后,它总是显示为白屏。虽然网络可以工作,但我无法以任何方式让用户界面工作。这是网络代码:

package progtech2bea;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class NetworkController implements Runnable {

public Main base;
private MainMenu mm;
private String ip;
private int port = 22222;
public int pnum;

private Thread thread;
private Socket socket;
private DataOutputStream os;
private DataInputStream is;

private ServerSocket serversocket;

private int errcount = 0;
private boolean commerror;

private boolean client;
private boolean accepted = false;

public void beginServer(String ip, MainMenu mm)
{
    this.ip = ip;
    this.mm = mm;
    if (!connect()) {
        initalizeServer();
        pnum = 1;
    }
    else
    {
        pnum = 2;
    }

    thread = new Thread(this, "WaterWar");
    thread.run();
}

@Override
public void run() {
    while (true) {
        tick();
        //m.repaint();

        if (!client && !accepted) {
            listenServerRequest();
        }
    }

}

private boolean connect() {
    try {
        socket = new Socket(ip, port);
        os = new DataOutputStream(socket.getOutputStream());
        is = new DataInputStream(socket.getInputStream());
        accepted = true;
        mm.dispose();
        base.showMain();
        base.moveToP2StartView();
        System.out.println("Successfully connected");
    } catch (IOException e) {
        System.out.println("No active server, initalizing new one");
        return false;
    }

    return true;
}

private void initalizeServer() {
    try {
        serversocket = new ServerSocket(port, 8, InetAddress.getByName(ip));
    } catch (Exception e) {
        System.out.println("Error initalizing the server");
    }

    client = false;
}

public void listenServerRequest() {
    Socket s = null;

    try {
        s = serversocket.accept();
        os = new DataOutputStream(s.getOutputStream());
        is = new DataInputStream(s.getInputStream());
        accepted = true;
        System.out.println("The client successfully connected");
        base.showMain();
        mm.dispose();            
    } catch (IOException e) {
        System.out.println("Error");
    }
}

public void tick() {

}
}

如果网络代码没有运行,jFrame 工作得很好。以下内容不起作用,它会在单独的类中调用:

//the jFrame component initalizing all the UI elements inside
Main m = new Main(jTextField1.getText(),jComboBox1.getSelectedIndex());
//calls the NetworkController's beginServer() method, trying to establish 
//connection/start a server
nc.beginServer(jTextField2.getText(),this);

有什么问题吗?

最佳答案

想通了。必须在此可运行对象之外进行线程初始化,然后将其运行为:

Thread t = new Thread(new Runnable() {...});
t.start();

关于执行网络代码后 Java UI 白屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55942044/

相关文章:

java - 将 Hibernate 3.2.5 迁移到 3.6

c++ - 在 Qt 中制作关于 GUI 窗口的游戏

java - 如何在 JavaFx 中创建可重新排序的 TableView

c - 我应该在与 IPv4 不同的端口上监听 IPv6 连接吗?

android - 通过网络连接更改 android 模拟器的 IMSI 号码结果

java - Z-Buffering 通常比 Painter 算法更快吗?

java - 如何在 Windows 中运行或安装 *.jar 文件?

java - 从源代码编译android APK

c++ - QtQuick : Change expand icon in TreeView

c - he->h_addr_list[0] 总是默认接口(interface)吗?