Java 如何在没有类的情况下使用另一个类的方法

Java 如何在没有类的情况下使用另一个类的方法,java,class,methods,Java,Class,Methods,我有一个showMessage()方法,它将字符串附加到JTextArea上,我想在我的“类中的类”(ServerThread)中调用它。我如何才能做到这一点没有主要的;或Main=newmain() public类主框架{ 私有静态最终长serialVersionUID=1L; 私人区域聊天窗口; 私有列表端口=新的ArrayList(); public Main()引发IOException{ 超级(“服务器控制台”); chatWindow=新的JTextArea(); chatWindo

我有一个showMessage()方法,它将字符串附加到JTextArea上,我想在我的“类中的类”(ServerThread)中调用它。我如何才能做到这一点没有主要的;或Main=newmain()

public类主框架{
私有静态最终长serialVersionUID=1L;
私人区域聊天窗口;
私有列表端口=新的ArrayList();
public Main()引发IOException{
超级(“服务器控制台”);
chatWindow=新的JTextArea();
chatWindow.setEditable(false);
JScrollPane scrollPane=新的JScrollPane(聊天窗口);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
滚动窗格.设置边界(0,20,596,200);
添加(滚动窗格);
setLayout(空);
设置大小(600300);
可设置大小(假);
setVisible(真);
getContentPane().setBackground(颜色为.white);
套接字s=null;
ServerSocket ss2=null;
showMessage(“服务器侦听…”\n);
试一试{
ss2=新服务器插座(3175);
}捕获(IOE异常){
e、 printStackTrace();
showMessage(“服务器错误”);
}
while(true){
试一试{
s=ss2.accept();
showMessage(“已建立连接”);
ports.add(s.getPort());
ServerThread st=新的ServerThread;
st.start();
}
捕获(例外e){
e、 printStackTrace();
showMessage(“连接错误”);
}
}
}
公共void showMessage(最终字符串m){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
附加(m);
}
});
}
}
类ServerThread扩展线程{
私有对象输出流输出;
私有对象输入流输入;
套接字s=null;
私有静态LinkedHashMap playerCoords=new LinkedHashMap();
公共服务器线程(套接字){
这个.s=s;
}
公开募捐{
}
}

示例:在run方法中,我希望有main.showMessage(string)之类的东西,而不需要声明main对象。

只需将方法声明为
静态

publicstaticvoidshowmessage(最后一个字符串m)

这样,你可以这样称呼它-


Main.showMessage(“一些字符串”)

同时声明
showMessage
方法和
chatWindow
字段
静态
。然后,您可以在需要的地方调用
Main.showMessage(“任意”)

但是一个更优雅的解决方案将是将这两个
singleton
s与
listener
s进行通信

声明一个接口
MessageListener
,方法是在message(stringmessage)

ServerThread
中保存
MessageListener
s的列表,并在
run
方法中调用它们

class ServerThread extends Thread {

   // class content 

    static List<MessageListener> messageListeners = new ArrayList<>();

    public void run() {
        for (MessageListener messageListener : messageListeners) {
            messageListener.onMessage("the message");
        }
    }
}
就这些。然后整个代码看起来像:

import java.awt.Color;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;

public class Main extends JFrame implements MessageListener {

    private static final long serialVersionUID = 1L;
    private JTextArea chatWindow;
    private List<Integer> ports = new ArrayList<Integer>();

    public Main() throws IOException {
        super("ServerConsole");

        ServerThread.messageListeners.add(this);

        chatWindow = new JTextArea();
        chatWindow.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatWindow);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setBounds(0, 20, 596, 200);
        add(scrollPane);

        setLayout(null);
        setSize(600, 300);
        setResizable(false);
        setVisible(true);
        getContentPane().setBackground(Color.white);

        Socket s = null;
        ServerSocket ss2 = null;
        showMessage("Server Listening......\n");
        try {
            ss2 = new ServerSocket(3175);
        } catch (IOException e) {
            e.printStackTrace();
            showMessage("Server error");
        }
        while (true) {
            try {
                s = ss2.accept();
                showMessage("connection Established\n");
                ports.add(s.getPort());
                ServerThread st = new ServerThread(s);
                st.start();

            }

            catch (Exception e) {
                e.printStackTrace();
                showMessage("Connection Error");

            }
        }

    }

    public void showMessage(final String m) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                chatWindow.append(m);
            }
        });

    }

    @Override
    public void onMessage(String message) {
        showMessage(message);
    }

}

interface MessageListener {
    public void onMessage(String message);
}

class ServerThread extends Thread {

    private ObjectOutputStream output;
    private ObjectInputStream input;
    Socket s = null;
    private static LinkedHashMap<Integer, String> playerCoords = new LinkedHashMap<Integer, String>();

    static List<MessageListener> messageListeners = new ArrayList<>();

    public ServerThread(Socket s) {
        this.s = s;
    }

    public void run() {
        for (MessageListener messageListener : messageListeners) {
            messageListener.onMessage("the message");
        }
    }
}
导入java.awt.Color;
导入java.io.IOException;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.ArrayList;
导入java.util.LinkedHashMap;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.ScrollPaneConstants;
导入javax.swing.SwingUtilities;
公共类Main扩展JFrame实现MessageListener{
私有静态最终长serialVersionUID=1L;
私人区域聊天窗口;
私有列表端口=新的ArrayList();
public Main()引发IOException{
超级(“服务器控制台”);
ServerThread.messageListeners.add(此);
chatWindow=新的JTextArea();
chatWindow.setEditable(false);
JScrollPane scrollPane=新的JScrollPane(聊天窗口);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
滚动窗格.设置边界(0,20,596,200);
添加(滚动窗格);
setLayout(空);
设置大小(600300);
可设置大小(假);
setVisible(真);
getContentPane().setBackground(颜色为.white);
套接字s=null;
ServerSocket ss2=null;
showMessage(“服务器侦听…”\n);
试一试{
ss2=新服务器插座(3175);
}捕获(IOE异常){
e、 printStackTrace();
showMessage(“服务器错误”);
}
while(true){
试一试{
s=ss2.accept();
showMessage(“已建立连接”);
ports.add(s.getPort());
ServerThread st=新的ServerThread;
st.start();
}
捕获(例外e){
e、 printStackTrace();
showMessage(“连接错误”);
}
}
}
公共void showMessage(最终字符串m){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
附加(m);
}
});
}
@凌驾
公共消息无效(字符串消息){
showMessage(消息);
}
}
接口消息侦听器{
公共消息无效(字符串消息);
}
类ServerThread扩展线程{
私有对象输出流输出;
私有对象输入流输入;
套接字s=null;
私有静态LinkedHashMap playerCoords=new LinkedHashMap();
静态列表messageListeners=new ArrayList();
公共服务器线程(套接字){
这个.s=s;
}
公开募捐{
for(MessageListener MessageListener:messageListeners){
onMessage(“消息”);
}
}
}

创建
showMessage
方法和
chatWindow
字段
静态
。然后你可以打电话到
Main.showMessage(“随便”)
Wow-man谢谢你的回答!我要试试看。好的是我只是研究了接口
class ServerThread extends Thread {

   // class content 

    static List<MessageListener> messageListeners = new ArrayList<>();

    public void run() {
        for (MessageListener messageListener : messageListeners) {
            messageListener.onMessage("the message");
        }
    }
}
public class Main extends JFrame implements MessageListener {

    // class content

    public Main() throws IOException {
        super("ServerConsole");

        ServerThread.messageListeners.add(this);

        // other content

    }

    // class content

    @Override
    public void onMessage(String message) {
        showMessage(message);
    }
}
import java.awt.Color;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;

public class Main extends JFrame implements MessageListener {

    private static final long serialVersionUID = 1L;
    private JTextArea chatWindow;
    private List<Integer> ports = new ArrayList<Integer>();

    public Main() throws IOException {
        super("ServerConsole");

        ServerThread.messageListeners.add(this);

        chatWindow = new JTextArea();
        chatWindow.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatWindow);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setBounds(0, 20, 596, 200);
        add(scrollPane);

        setLayout(null);
        setSize(600, 300);
        setResizable(false);
        setVisible(true);
        getContentPane().setBackground(Color.white);

        Socket s = null;
        ServerSocket ss2 = null;
        showMessage("Server Listening......\n");
        try {
            ss2 = new ServerSocket(3175);
        } catch (IOException e) {
            e.printStackTrace();
            showMessage("Server error");
        }
        while (true) {
            try {
                s = ss2.accept();
                showMessage("connection Established\n");
                ports.add(s.getPort());
                ServerThread st = new ServerThread(s);
                st.start();

            }

            catch (Exception e) {
                e.printStackTrace();
                showMessage("Connection Error");

            }
        }

    }

    public void showMessage(final String m) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                chatWindow.append(m);
            }
        });

    }

    @Override
    public void onMessage(String message) {
        showMessage(message);
    }

}

interface MessageListener {
    public void onMessage(String message);
}

class ServerThread extends Thread {

    private ObjectOutputStream output;
    private ObjectInputStream input;
    Socket s = null;
    private static LinkedHashMap<Integer, String> playerCoords = new LinkedHashMap<Integer, String>();

    static List<MessageListener> messageListeners = new ArrayList<>();

    public ServerThread(Socket s) {
        this.s = s;
    }

    public void run() {
        for (MessageListener messageListener : messageListeners) {
            messageListener.onMessage("the message");
        }
    }
}