Java 导出可运行JAR文件不工作

Java 导出可运行JAR文件不工作,java,eclipse,swing,jar,Java,Eclipse,Swing,Jar,我读过很多类似的问题,但我找不到任何有用的东西,所以我不得不自己问一个 我有一个使用TCP套接字连接服务器和客户端的程序,在一个包中总共有5个类,其中两个有一个main方法(server和clientGUI) 但当我在server.java->export->runnable jar文件上使用右键单击服务器运行配置时,它工作了,我可以从eclipse外部运行它。但是当我对clientGUI.java执行同样的操作时,运行clientGUI.jar文件时不会发生任何事情 服务器中的主方法如下所示

我读过很多类似的问题,但我找不到任何有用的东西,所以我不得不自己问一个

我有一个使用TCP套接字连接服务器和客户端的程序,在一个包中总共有5个类,其中两个有一个main方法(server和clientGUI)

但当我在server.java->export->runnable jar文件上使用右键单击服务器运行配置时,它工作了,我可以从eclipse外部运行它。但是当我对clientGUI.java执行同样的操作时,运行clientGUI.jar文件时不会发生任何事情

服务器中的主方法如下所示:

public static void main(String[] args) {
    Server s = new Server();
    s.start();
}
但在ClientGUI中,我只有以下几点:

public static void main(String[] args) {
    new ClientGUI();
}
这就是问题所在吗?我在ClientGUI中没有
start()
,因为在用户输入之前不会发生任何事情,与图形相关的所有内容都在构造函数中编码,其余的都在处理按钮的
ActionPerformed
方法中


客户端GUI:

public class ClientGUI extends JFrame implements ActionListener {

private static final long serialVersionUID = -1115273859077115660L;
private JTextField textField;
private JTextArea chatBox;

private static Client client;
private JButton resetB;
JButton btnConnect;
JLabel lblGrid;
JLabel lblGrid2;
static int port = 56667;
String IP;
private JTextField txtPort;
private JTextField txtIP;
final JButton readyB;

ClientGUI() {
    super("Client");
    getContentPane().setBackground(Color.LIGHT_GRAY);
    setResizable(false);
    setBounds(100, 100, 945, 750);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBackground(Color.WHITE);
    panel.setBounds(10, 11, 920, 520);
    getContentPane().add(panel);
    panel.setLayout(null);

    readyB = new JButton("READY");
    readyB.setEnabled(false);
    readyB.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            lblGrid.setVisible(true);
            readyB.setEnabled(false);
            client.sendMessage(new Message(Message.READY, client.myID, ""));
        }
    });
    readyB.setBounds(784, 461, 126, 48);
    panel.add(readyB);

    BufferedImage myPicture = null;
    try {
        myPicture = ImageIO.read(new File("img/grid.png"));
    } catch (IOException e) {

        e.printStackTrace();
    }
    lblGrid = new JLabel(new ImageIcon(myPicture));
    lblGrid.setText("");
    lblGrid.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent m) {
            int x = m.getX() / 40;
            int y = m.getY() / 40;
            if(client.myShots[x][y] == false){
            client.sendMessage(new Message(Message.SHOT, client.myID,
                    (x + 1) + " " + (y + 1)));
            client.myShots[x][y] = true;}
        }
    });
    lblGrid.setBounds(480, 40, 401, 401);
    panel.add(lblGrid);
    lblGrid.setVisible(false);

    lblGrid2 = new JLabel(new ImageIcon(myPicture));
    lblGrid2.setText("");
    lblGrid2.setBounds(40, 40, 401, 401);
    panel.add(lblGrid2);

    textField = new JTextField();
    textField.setBounds(493, 681, 437, 20);
    getContentPane().add(textField);
    textField.setColumns(10);
    textField.addActionListener(this);

    JPanel panel_1 = new JPanel();
    panel_1.setBounds(10, 542, 210, 159);
    getContentPane().add(panel_1);
    panel_1.setLayout(null);

    resetB = new JButton("R");
    resetB.setBounds(160, 108, 40, 40);
    resetB.addActionListener(this);
    panel_1.add(resetB);

    btnConnect = new JButton("Connect");
    btnConnect.setBounds(230, 542, 89, 23);
    getContentPane().add(btnConnect);
    btnConnect.addActionListener(this);

    JLabel lblIp = new JLabel("IP:");
    lblIp.setBounds(329, 546, 22, 14);
    getContentPane().add(lblIp);

    JLabel lblPort = new JLabel("Port:");
    lblPort.setBounds(329, 580, 46, 14);
    getContentPane().add(lblPort);

    txtPort = new JTextField();
    txtPort.setText("1234");
    txtPort.setBounds(361, 577, 120, 20);
    getContentPane().add(txtPort);
    txtPort.setColumns(10);

    txtIP = new JTextField();
    txtIP.setText("192.168.0.25");
    txtIP.setBounds(361, 542, 120, 20);
    getContentPane().add(txtIP);
    txtIP.setColumns(10);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(491, 544, 439, 124);
    getContentPane().add(scrollPane);

    chatBox = new JTextArea();
    scrollPane.setViewportView(chatBox);
    chatBox.setEditable(false);
    chatBox.setLineWrap(true);

    textField.requestFocus();

    setVisible(true);
}

public static void main(String[] args) {
    new ClientGUI();
}

void drawX(JLabel grid, int x, int y) {
    JLabel xg = (new JLabel(new ImageIcon("img/x.png")));
    xg.setBounds(40 * (x - 1), 40 * (y - 1), 40, 40);
    grid.add(xg);
    xg.setVisible(true);
    repaint();
}

void drawMiss(JLabel grid, int x, int y) {
    JLabel xg = (new JLabel(new ImageIcon("img/miss.png")));
    xg.setBounds(40 * (x - 1), 40 * (y - 1), 40, 40);
    grid.add(xg);
    xg.setVisible(true);
    repaint();
}

public void actionPerformed(ActionEvent e) {
    Object o = e.getSource();

    if (o == textField) {
        String text = textField.getText();

        client.sendMessage(new Message(Message.CHAT, client.myID, text));
        textField.setText("");
    }

    if (o == resetB) {
    }

    if (o == btnConnect) {
        IP = txtIP.getText();
        port = Integer.parseInt(txtPort.getText());

        client = new Client(IP, port, this);
        // test if we can start the Client
        if (!client.start())
            return;
        else
        client.display("Connected!");
        txtIP.setEnabled(false);
        txtPort.setEnabled(false);
        btnConnect.setEnabled(false);
        readyB.setEnabled(true);
    }
}

public void append(String string) {
    chatBox.append(string);
    chatBox.setCaretPosition(chatBox.getText().length() - 1);
}
}
客户:

public class Client {
private ObjectOutputStream sOutput;
private ObjectInputStream sInput;
Socket socket;
private SimpleDateFormat sdf;
private static ClientGUI cg;
private static String IP;
private static int port;
int myID;
boolean[][]myShots = new boolean [10][10];

Client(String IP, int port, ClientGUI cg) {
    this.IP = IP;
    this.port = port;
    this.cg = cg;

    sdf = new SimpleDateFormat("HH:mm:ss");
}


public boolean start() {
    try {
        socket = new Socket(IP, port);
    } catch (Exception e) {
        display("Server not running!");
        return false;
    }
    try {
        sInput = new ObjectInputStream(socket.getInputStream());
        sOutput = new ObjectOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        display("Exception creating new Input/output Streams: " + e);
        return false;
    }

    new ListenFromServer().start();

    return true;
}

void display(String msg) {
    cg.append(sdf.format(new Date()) + ": " + msg + "\n");
}

void sendMessage(Message msg) {
    try {
        sOutput.writeObject(msg);
    } catch (IOException e) {
        display("Exception writing to server: " + e);
    }
}

public void clearMyShots(int id) {
        for (int i = 0; i < 10; i++)
            for (int j = 0; j < 10; j++)
                myShots[i][j] = false;
}

class ListenFromServer extends Thread {
    public void run() {
        Message cm = null;
        while (true) {

            try {
                cm = (Message) sInput.readObject();

            } catch (IOException ioe) {
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

            switch (cm.getType()) {
            case Message.ID:
                myID = Integer.parseInt(cm.getMessage());
                display("Your ID is " + myID);
                break;
            case Message.HIT:

                String[] partHit = cm.getMessage().split(" ");
                int x = Integer.parseInt(partHit[0]);
                int y = Integer.parseInt(partHit[1]);
                int whoShot = cm.getID();
                if (whoShot == myID) {
                    display("HIT: " + (char) (x + 64) + y);
                    cg.drawX(cg.lblGrid, x, y);

                } else
                    cg.drawX(cg.lblGrid2, x, y);
                break;
            case Message.SHOT:
                display("SHOT: " + cm.getMessage());

                break;
            case Message.MISS: {
                String[] partMiss = cm.getMessage().split(" ");
                x = Integer.parseInt(partMiss[0]);
                y = Integer.parseInt(partMiss[1]);
                whoShot = cm.getID();
                if (whoShot == myID) {
                    display("MISS: " + (char) (x + 64) + y);
                    cg.drawMiss(cg.lblGrid, x, y);
                } else
                    cg.drawMiss(cg.lblGrid2, x, y);
                break;
            }

            case Message.DESTROYED:
                break;
            case Message.CHAT: {
                display("Player " + cm.getID() + ": " + cm.getMessage());
                cm = null;

                break;
            }
            }

        }
    }
}
}
公共类客户端{
私有对象输出流sOutput;
私有对象输入流输入;
插座;
私人简化格式sdf;
私有静态客户端;
私有静态字符串IP;
专用静态int端口;
int-myID;
boolean[]myShots=新的boolean[10][10];
客户端(字符串IP、int端口、客户端GUI cg){
this.IP=IP;
this.port=端口;
this.cg=cg;
sdf=新的简化格式(“HH:mm:ss”);
}
公共布尔起始(){
试一试{
插座=新插座(IP,端口);
}捕获(例外e){
显示(“服务器未运行!”);
返回false;
}
试一试{
sInput=newObjectInputStream(socket.getInputStream());
sOutput=newObjectOutputStream(socket.getOutputStream());
}捕获(IOE异常){
显示(“创建新输入/输出流异常:”+e);
返回false;
}
新建ListenFromServer().start();
返回true;
}
无效显示(字符串消息){
cg.append(sdf.format(new Date())+“:“+msg+”\n”);
}
无效发送消息(消息消息消息){
试一试{
sOutput.writeObject(msg);
}捕获(IOE异常){
显示(“向服务器写入异常:”+e);
}
}
公共无效clearMyShots(内部id){
对于(int i=0;i<10;i++)
对于(int j=0;j<10;j++)
myShots[i][j]=假;
}
类ListenFromServer扩展线程{
公开募捐{
消息cm=null;
while(true){
试一试{
cm=(消息)sInput.readObject();
}捕获(ioe异常ioe){
}catch(classnotfounde异常){
e、 printStackTrace();
}
开关(cm.getType()){
case Message.ID:
myID=Integer.parseInt(cm.getMessage());
显示(“您的ID为”+myID);
打破
case Message.HIT:
字符串[]partHit=cm.getMessage().split(“”);
intx=Integer.parseInt(partHit[0]);
int y=Integer.parseInt(partHit[1]);
int whoShot=cm.getID();
如果(whoShot==myID){
显示(“点击:”+(字符)(x+64)+y);
cg.drawX(cg.lblGrid,x,y);
}否则
cg.drawX(cg.lblGrid2,x,y);
打破
case Message.SHOT:
显示(“快照:+cm.getMessage());
打破
case Message.MISS:{
字符串[]partMiss=cm.getMessage().split(“”);
x=Integer.parseInt(partMiss[0]);
y=Integer.parseInt(partMiss[1]);
whoShot=cm.getID();
如果(whoShot==myID){
显示(“未命中:”+(字符)(x+64)+y);
cg.drawMiss(cg.lblGrid,x,y);
}否则
cg.drawMiss(cg.lblGrid2,x,y);
打破
}
案例消息。已销毁:
打破
case Message.CHAT:{
显示(“播放器”+cm.getID()+”:“+cm.getMessage());
cm=零;
打破
}
}
}
}
}
}

要启动Swing应用程序(如GUI客户端),您需要在主方法中包含以下内容:

javax.swing.SwingUtilities.invokeLater
(
    new Runnable()
    {
        public void run()
        {
            new ClientGUI();
        }
    }
);

下面是一个帮助您了解启动Swing应用程序所需的最低要求的示例。

我发现原因与主方法无关。在用户@vanje之后,我从windows命令行运行了我的程序,它显示IOException正在读取我忘记复制到新目录的图像文件。我做到了,它正在工作

ClientGUI()类是实现Runnable还是扩展线程?因为如果它是,那么它就意味着它是一个线程。如果是这种情况,那么应该在构造函数之后添加start()方法调用。你能发布更多ClientGUI类的代码吗?@nick.katsip
ClientGUI扩展JFrame实现ActionListener
@nick.katsip我也发布了客户端的代码。客户端是从ClientGUI创建的,它处理服务器连接和消息传递。客户端类中还有额外的线程类。您有两个主要方法。@Asalas77从代码中可以清楚地看出,您需要调用
ClientGUI.start()
方法才能启动客户端。