【问题标题】:Can't get server status on an applet无法在小程序上获取服务器状态
【发布时间】:2014-01-06 00:57:27
【问题描述】:

我正在尝试显示服务器状态,绿色为亮红色为灭。但是我似乎无法让小程序改变颜色!

@SuppressWarnings("serial")
public class MinecraftPinger extends Applet {

    boolean O = true;

    public void Pinger() throws IOException, InterruptedException {

        while (true) {
            Socket socket = SocketFactory.getDefault().createSocket();
            try {
                socket.setSoTimeout(5000);
                socket.connect(new InetSocketAddress("192.148.1.1", 25565));
                socket.close();
                System.out.println(O);
                Thread.sleep(600000);
                repaint();
            } catch (ConnectException e) {
                O = false;
                repaint();
                Thread.sleep(600000);

            }
        }
    }//ends Pinger

    public void paint(Graphics g) {
        try {
            if (O == true) {
                setSize(100, 25);
                setBackground(Color.GREEN);
            } else {
                setSize(100, 25);
                setBackground(Color.RED);
            }
        } catch (Exception ex) {
            System.out.println("Fail!");

        }

    }
}

【问题讨论】:

  • 请在此处发布您的代码;不在第三方网站上。
  • 我认为您的计算机 IP 地址不是192.148.1.1,我认为您将计算机 IP 与路由器混淆了
  • 那个ip是假的让小程序变红但是小程序不会变红
  • 不要在事件线程中调用像connect()这样的阻塞操作,例如在ActionListeners. 并且如果这段代码没有在事件线程中运行,请不要调用repaint(),除非你在事件线程中。

标签: java swing applet network-programming awt


【解决方案1】:

您的背景没有显示,因为您覆盖了绘画方法。尝试使用在paint 方法中传递给您的Graphics 对象,而不是设置背景颜色

public void paint(Graphics g) {
    if (connectionWorked == true) {
        g.setColor(Color.green);
        g.fillRect(0, 0, getWidth(), getHeight());
    } else {
        g.setColor(Color.red);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

正如 EJP 所说,您不应该在 EDT 期间调用阻塞操作。简而言之,这意味着在程序(接口/事件线程)的正常执行期间不要执行需要大量时间的操作。在您的情况下,不要查询服务器并阻止您的小程序初始化和显示。使用以下代码可以避免这种情况:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
         // do some heavy lifting here
    }
});

我看不到 Pinger() 被调用的地方。使用Applet类时需要重写init()方法来初始化数据。

你可能会得到这样的结果

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.net.SocketFactory;
import javax.swing.SwingUtilities;

public class MinecraftPinger extends Applet {

    private Boolean connectionWorked = null;
    private boolean pinging = false;

    @Override
    public void init() {

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            pinging = true;
            startPinging();
        }
    });
    }

    public void paint(Graphics g) {
        if (connectionWorked == null) {
            g.drawString("Attempting Connection...", getWidth()/2-40, getHeight()/2-10);
        } else if (connectionWorked == true) {
            g.setColor(Color.green);
            g.fillRect(0, 0, getWidth(), getHeight());
        } else {
            g.setColor(Color.red);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }

    public void startPinging() {
        while (pinging) {
            try {
                Socket socket = SocketFactory.getDefault().createSocket();
                socket.setSoTimeout(2000);
                socket.connect(new InetSocketAddress("mc.jujucraft.net", 25565));
                socket.close();
                connectionWorked = true;
            } catch (Exception ex) {
                connectionWorked = false;
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
            repaint();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

【讨论】:

  • 如果它有助于解决问题,请accept回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多