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